示例#1
1
        public void AddImage(BackgroundImageClass image)
        {
            var imageBytes = webClientWrapper.DownloadBytes(image.ImageUrl);
            Bitmap bitmap = null;
            using (var originalBitmap = new Bitmap(new MemoryStream(imageBytes)))
            {
                using (var writer = new SpriteWriter(image.Width ?? originalBitmap.Width, image.Height ?? originalBitmap.Height))
                {
                    var width = image.Width ?? originalBitmap.Width;
                    if (width > originalBitmap.Width)
                        width = originalBitmap.Width;
                    var height = image.Height ?? originalBitmap.Height;
                    if (height > originalBitmap.Height)
                        height = originalBitmap.Height;
                    var x = image.XOffset.Offset < 0 ? Math.Abs(image.XOffset.Offset) : 0;
                    var y = image.YOffset.Offset < 0 ? Math.Abs(image.YOffset.Offset) : 0;

                    writer.WriteImage(originalBitmap.Clone(new Rectangle(x, y, width, height), originalBitmap.PixelFormat));
                    bitmap = writer.SpriteImage;
                    if ((originalBitmap.Width * originalBitmap.Height) > (bitmap.Width * bitmap.Height))
                        Size += writer.GetBytes("image/png").Length;
                    else
                        Size += imageBytes.Length;
                }
            }
            images.Add(bitmap);
            Width += bitmap.Width;
            if (Height < bitmap.Height) Height = bitmap.Height;
        }
        private static void InheritMissingProperties(BackgroundImageClass derrivableClass, BackgroundImageClass imageClass)
        {
            if (DerivableHasMissingProperty(derrivableClass, imageClass, PropertyCompletion.HasYOffset))
                imageClass.YOffset = derrivableClass.YOffset;

            if (DerivableHasMissingProperty(derrivableClass, imageClass, PropertyCompletion.HasXOffset))
                imageClass.XOffset = derrivableClass.XOffset;

            if (DerivableHasMissingProperty(derrivableClass, imageClass, PropertyCompletion.HasRepeat))
                imageClass.Repeat = derrivableClass.Repeat;

            if (DerivableHasMissingProperty(derrivableClass, imageClass, PropertyCompletion.HasImage))
                imageClass.ImageUrl = derrivableClass.ImageUrl;

            if (DerivableHasMissingProperty(derrivableClass, imageClass, PropertyCompletion.HasPaddingBottom))
                imageClass.PaddingBottom = derrivableClass.PaddingBottom;

            if (DerivableHasMissingProperty(derrivableClass, imageClass, PropertyCompletion.HasPaddingTop))
                imageClass.PaddingTop = derrivableClass.PaddingTop;

            if (DerivableHasMissingProperty(derrivableClass, imageClass, PropertyCompletion.HasPaddingLeft))
                imageClass.PaddingLeft = derrivableClass.PaddingLeft;

            if (DerivableHasMissingProperty(derrivableClass, imageClass, PropertyCompletion.HasPaddingRight))
                imageClass.PaddingRight = derrivableClass.PaddingRight;

            if (DerivableHasMissingProperty(derrivableClass, imageClass, PropertyCompletion.HasWidth))
                imageClass.ExplicitWidth = derrivableClass.ExplicitWidth;

            if (DerivableHasMissingProperty(derrivableClass, imageClass, PropertyCompletion.HasHeight))
                imageClass.ExplicitHeight = derrivableClass.ExplicitHeight;
        }
        public IEnumerable<BackgroundImageClass> ExtractImageUrls(string cssContent)
        {
            var finalUrls = new List<BackgroundImageClass>();
            var draftUrls = new List<BackgroundImageClass>();
            var classCounter = 0;
            foreach (var classMatch in classPattern.Matches(cssContent))
            {
                var imageClass = new BackgroundImageClass(classMatch.ToString(), ++classCounter);
                if (!ShouldFlatten(imageClass)) continue;
                if (!IsComplete(imageClass) && ShouldFlatten(imageClass))
                {
                    var workList = new List<BackgroundImageClass>();
                    for (var n = draftUrls.Count - 1; n > -1; n--)
                    {
                        var selectors = draftUrls[n].Selector.Split(new [] {','});
                        var targetSelectors = imageClass.Selector.Split(new[] { ',' });
                        foreach (var selector in selectors)
                        {
                            if (targetSelectors
                                .Any(targetSelector => cssSelectorAnalyzer.IsInScopeOfTarget(targetSelector.Trim(), selector.Trim())))
                                workList.Add(draftUrls[n]);
                        }
                    }
                    workList.Sort(selectorComparer);
                    foreach (var cls in workList.Where(cls => !IsComplete(imageClass)))
                        InheritMissingProperties(cls, imageClass);
                }

                draftUrls.Add(imageClass);
                if (CanSprite(imageClass))
                    finalUrls.Add(imageClass);
            }
            return finalUrls;
        }
示例#4
0
 public virtual void Add(BackgroundImageClass image)
 {
     var imageKey = new ImageMetadata(image);
     if (spriteList.ContainsKey(imageKey))
         return;
     SpritedImage spritedImage = null;
     try
     {
         spritedImage = SpriteContainer.AddImage(image);
     }
     catch (InvalidOperationException ex)
     {
         var message = string.Format("There were errors reducing {0}", image.ImageUrl);
         var wrappedException =
             new ApplicationException(message, ex);
         RRTracer.Trace(message);
         RRTracer.Trace(ex.ToString());
         if (RequestReduceModule.CaptureErrorAction != null)
             RequestReduceModule.CaptureErrorAction(wrappedException);
         return;
     }
     spriteList.Add(imageKey, spritedImage);
     if (SpriteContainer.Size >= config.SpriteSizeLimit || (SpriteContainer.Colors >= config.SpriteColorLimit && !config.ImageQuantizationDisabled && !config.ImageOptimizationDisabled))
         Flush();
 }
示例#5
0
 public SpritedImage(int averageColor, BackgroundImageClass cssClass, Bitmap image)
 {
     AverageColor = averageColor;
     CssClass = cssClass;
     Image = image;
     Position = -1;
 }
示例#6
0
 public virtual void Add(BackgroundImageClass image)
 {
     var imageKey = new ImageMetadata(image);
     if (RRContainer.Current.GetAllInstances<IFilter>().Where(x => x is SpriteFilter).FirstOrDefault(y => y.IgnoreTarget(new SpriteFilterContext(image))) != null || spriteList.ContainsKey(imageKey))
         return;
     SpritedImage spritedImage;
     try
     {
         spritedImage = SpriteContainer.AddImage(image);
     }
     catch (InvalidOperationException ex)
     {
         var message = string.Format("There were errors reducing {0}", image.ImageUrl);
         var wrappedException =
             new ApplicationException(message, ex);
         RRTracer.Trace(message);
         RRTracer.Trace(ex.ToString());
         if (Registry.CaptureErrorAction != null)
             Registry.CaptureErrorAction(wrappedException);
         return;
     }
     spriteList.Add(imageKey, spritedImage);
     if (SpriteContainer.Size >= config.SpriteSizeLimit || (SpriteContainer.Colors >= config.SpriteColorLimit && !config.ImageQuantizationDisabled && !config.ImageOptimizationDisabled))
         Flush();
 }
示例#7
0
 public virtual Sprite this[BackgroundImageClass image]
 {
     get
     {
         var imageKey = new ImageMetadata(image);
         return spriteList.ContainsKey(imageKey) ? spriteList[imageKey] : null;
     }
 }
 private static bool DerivableHasMissingProperty(BackgroundImageClass derrivableClass, BackgroundImageClass imageClass, PropertyCompletion property)
 {
     if ((imageClass.PropertyCompletion & property) != property && (derrivableClass.PropertyCompletion & property) == property)
     {
         imageClass.PropertyCompletion = imageClass.PropertyCompletion | property;
         return true;
     }
     return false;
 }
            public void WillLeaveImageUrlNullIfBackgroundImageUrlIsDataUri()
            {
                var css =
    @"
.LocalNavigation .TabOn,.LocalNavigation .TabOn:hover {
    background-image: url(""data:image/png;base64,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"");
}";

                var testable = new BackgroundImageClass(css, 0);

                Assert.Null(testable.ImageUrl);
            }
            public void WillLeaveImageUrlNullIfBackgroundImageUrlIsEmpty()
            {
                var css =
    @"
.LocalNavigation .TabOn,.LocalNavigation .TabOn:hover {
    background-image: url("""");
}";

                var testable = new BackgroundImageClass(css, 0);

                Assert.Null(testable.ImageUrl);
            }
            public void WillSetImageUrlFromBackgroundImageStyle()
            {
                var css =
    @"
.LocalNavigation .TabOn,.LocalNavigation .TabOn:hover {
    background-image: url(""http://i3.social.microsoft.com/contentservice/1f22465a-498c-46f1-83d3-9dad00d8a950/subnav_on_technet.png"");
}";

                var testable = new BackgroundImageClass(css, 0);

                Assert.Equal("http://i3.social.microsoft.com/contentservice/1f22465a-498c-46f1-83d3-9dad00d8a950/subnav_on_technet.png", testable.ImageUrl);
            }
            public void WillSetImageUrlFromShortcutStyleWhwenLastPropertyWithNoSemicolon()
            {
                var css =
    @"
.LocalNavigation .TabOn,.LocalNavigation .TabOn:hover {
    background: #fff url(""http://i3.social.microsoft.com/contentservice/1f22465a-498c-46f1-83d3-9dad00d8a950/subnav_on_technet.png"") repeat
}";

                var testable = new BackgroundImageClass(css, 0);

                Assert.Equal("http://i3.social.microsoft.com/contentservice/1f22465a-498c-46f1-83d3-9dad00d8a950/subnav_on_technet.png", testable.ImageUrl);
            }
示例#13
0
 public virtual Sprite Add(BackgroundImageClass image)
 {
     var imageKey = new ImageMetadata(image);
     if (spriteList.ContainsKey(imageKey))
         return spriteList[imageKey];
     var currentPositionToReturn = SpriteContainer.Width;
     SpriteContainer.AddImage(image);
     var sprite = new Sprite(currentPositionToReturn, spriteIndex);
     if (SpriteContainer.Size >= config.SpriteSizeLimit)
         Flush();
     spriteList.Add(imageKey, sprite);
     return sprite;
 }
            public void WillSetSecondOffsetAsXOffsetWhenFirstOffsetIsBottom(string statedOffset, PositionMode expectedPositionMode, int expectedOffset)
            {
                var css =
                @"
                .LocalNavigation .TabOn,.LocalNavigation .TabOn:hover {{
                background: url(""http://i3.social.microsoft.com/contentservice/1f22465a-498c-46f1-83d3-9dad00d8a950/subnav_on_technet.png"") no-repeat;
                background-position: bottom {0};
                }}";

                var testable = new BackgroundImageClass(string.Format(css, statedOffset), "http://server/content/style.css");

                Assert.Equal(expectedPositionMode, testable.XOffset.PositionMode);
                Assert.Equal(expectedOffset, expectedPositionMode == PositionMode.Direction ? (int)testable.XOffset.Direction : testable.XOffset.Offset);
            }
示例#15
0
        public SpritedImage AddImage(BackgroundImageClass image)
        {
            var imageBytes = webClientWrapper.DownloadBytes(image.ImageUrl);
            Bitmap bitmap;
            using (var originalBitmap = new Bitmap(new MemoryStream(imageBytes)))
            {
                using (var writer = new SpriteWriter(image.Width ?? originalBitmap.Width, image.Height ?? originalBitmap.Height))
                {
                    var width = image.Width ?? originalBitmap.Width;
                    if (width > originalBitmap.Width)
                        width = originalBitmap.Width;
                    var height = image.Height ?? originalBitmap.Height;
                    if (height > originalBitmap.Height)
                        height = originalBitmap.Height;
                    var x = image.XOffset.Offset < 0 ? Math.Abs(image.XOffset.Offset) : 0;
                    var y = image.YOffset.Offset < 0 ? Math.Abs(image.YOffset.Offset) : 0;

                    try
                    {
                        using (var bm = originalBitmap.Clone(new Rectangle(x, y, width, height), originalBitmap.PixelFormat))
                        {
                            writer.WriteImage(bm);
                        }
                    }
                    catch (OutOfMemoryException)
                    {
                        throw new InvalidOperationException(string.Format("Unable to Add {0} to Sprite.", image.OriginalImageUrl));
                    }
                    bitmap = writer.SpriteImage;
                    if ((originalBitmap.Width * originalBitmap.Height) > (bitmap.Width * bitmap.Height))
                        Size += writer.GetBytes("image/png").Length;
                    else
                        Size += imageBytes.Length;
                }
            }
            var avgColor = rrConfiguration.IsFullTrust ? GetColors(bitmap) : 0;
            var spritedImage = new SpritedImage(avgColor, image, bitmap);
            images.Add(spritedImage);
            Width += bitmap.Width + 1;
            if (Height < bitmap.Height) Height = bitmap.Height;
            return spritedImage;
        }
 public IEnumerable<BackgroundImageClass> ExtractImageUrls(ref string cssContent, string cssUrl)
 {
     var urls = new List<BackgroundImageClass>();
     foreach (var classMatch in classPattern.Matches(cssContent))
     {
         var imageClass = new BackgroundImageClass(classMatch.ToString(), cssUrl);
         if(imageClass.OriginalImageUrl != null)
             cssContent = cssContent.Replace(classMatch.ToString(), imageClass.OriginalClassString);
         if (imageClass.ImageUrl != null)
         {
             if (imageClass.Width > 0 && imageClass.Repeat == RepeatStyle.NoRepeat
                 && ((imageClass.XOffset.PositionMode == PositionMode.Direction && imageClass.XOffset.Direction == Direction.Left)
                     || (imageClass.XOffset.PositionMode != PositionMode.Direction && imageClass.XOffset.Offset <= 0))
                 && ((imageClass.YOffset.PositionMode == PositionMode.Direction && imageClass.YOffset.Direction == Direction.Top)
                     || (imageClass.YOffset.PositionMode == PositionMode.Percent && imageClass.YOffset.Offset == 0)
                     || (imageClass.YOffset.PositionMode == PositionMode.Unit)))
                         urls.Add(imageClass);
         }
     }
     return urls;
 }
示例#17
0
 public virtual void Add(BackgroundImageClass image)
 {
     var imageKey = new ImageMetadata(image);
     if (RRContainer.Current.GetAllInstances<IFilter>().Where(x => x is SpriteFilter).FirstOrDefault(y => y.IgnoreTarget(new SpriteFilterContext(image))) != null)
         return;
     if (SpriteList.Any(x => x.Key.Equals(imageKey)))
     {
         var originalImage = SpriteList.First(x => x.Key.Equals(imageKey)).Value;
         var clonedImage = new SpritedImage(originalImage.AverageColor, image, originalImage.Image) { Position = originalImage.Position, Url = originalImage.Url, Metadata = imageKey };
         //SpriteContainer.AddImage(clonedImage);
         SpriteList.Add(new KeyValuePair<ImageMetadata, SpritedImage>(imageKey, clonedImage));
         return;
     }
     SpritedImage spritedImage;
     var sprite = SpriteList.FirstOrDefault(x => x.Value.CssClass.ImageUrl == image.ImageUrl);
     if(sprite.Value != null)
     {
         image.IsSprite = true;
         sprite.Value.CssClass.IsSprite = true;
     }
     try
     {
         spritedImage = SpriteContainer.AddImage(image);
         spritedImage.Metadata = imageKey;
     }
     catch (Exception ex)
     {
         var message = string.Format("There were errors reducing {0}", image.ImageUrl);
         var wrappedException =
             new ApplicationException(message, ex);
         RRTracer.Trace(message);
         RRTracer.Trace(ex.ToString());
         if (Registry.CaptureErrorAction != null)
             Registry.CaptureErrorAction(wrappedException);
         return;
     }
     SpriteList.Add(new KeyValuePair<ImageMetadata, SpritedImage>(imageKey, spritedImage));
     if (SpriteContainer.Size >= config.SpriteSizeLimit || (SpriteContainer.Colors >= config.SpriteColorLimit && !config.ImageQuantizationDisabled && !config.ImageOptimizationDisabled))
         Flush();
 }
示例#18
0
        private static void InheritMissingProperties(BackgroundImageClass derrivableClass, BackgroundImageClass imageClass)
        {
            if (DerivableHasMissingProperty(derrivableClass, imageClass, PropertyCompletion.HasYOffset))
            {
                imageClass.YOffset = derrivableClass.YOffset;
            }

            if (DerivableHasMissingProperty(derrivableClass, imageClass, PropertyCompletion.HasXOffset))
            {
                imageClass.XOffset = derrivableClass.XOffset;
            }

            if (DerivableHasMissingProperty(derrivableClass, imageClass, PropertyCompletion.HasRepeat))
            {
                imageClass.Repeat = derrivableClass.Repeat;
            }

            if (DerivableHasMissingProperty(derrivableClass, imageClass, PropertyCompletion.HasImage))
            {
                imageClass.ImageUrl = derrivableClass.ImageUrl;
            }

            if (DerivableHasMissingProperty(derrivableClass, imageClass, PropertyCompletion.HasPaddingBottom))
            {
                imageClass.PaddingBottom = derrivableClass.PaddingBottom;
            }

            if (DerivableHasMissingProperty(derrivableClass, imageClass, PropertyCompletion.HasPaddingTop))
            {
                imageClass.PaddingTop = derrivableClass.PaddingTop;
            }

            if (DerivableHasMissingProperty(derrivableClass, imageClass, PropertyCompletion.HasPaddingLeft))
            {
                imageClass.PaddingLeft = derrivableClass.PaddingLeft;
            }

            if (DerivableHasMissingProperty(derrivableClass, imageClass, PropertyCompletion.HasPaddingRight))
            {
                imageClass.PaddingRight = derrivableClass.PaddingRight;
            }

            if (DerivableHasMissingProperty(derrivableClass, imageClass, PropertyCompletion.HasWidth))
            {
                imageClass.ExplicitWidth = derrivableClass.ExplicitWidth;
            }

            if (DerivableHasMissingProperty(derrivableClass, imageClass, PropertyCompletion.HasHeight))
            {
                imageClass.ExplicitHeight = derrivableClass.ExplicitHeight;
            }
        }
示例#19
0
 private static bool DerivableHasMissingProperty(BackgroundImageClass derrivableClass, BackgroundImageClass imageClass, PropertyCompletion property)
 {
     if ((imageClass.PropertyCompletion & property) != property && (derrivableClass.PropertyCompletion & property) == property)
     {
         imageClass.PropertyCompletion = imageClass.PropertyCompletion | property;
         return(true);
     }
     return(false);
 }
示例#20
0
 public SpritedImage(int averageColor, BackgroundImageClass cssClass, Bitmap Image)
 {
     AverageColor = averageColor;
     CssClass     = cssClass;
     this.Image   = Image;
 }
示例#21
0
        public SpritedImage AddImage(BackgroundImageClass image)
        {
            var    imageBytes = webClientWrapper.DownloadBytes(image.ImageUrl);
            Bitmap bitmap;

            using (var originalBitmap = new Bitmap(new MemoryStream(imageBytes)))
            {
                using (var writer = new SpriteWriter(image.Width ?? originalBitmap.Width, image.Height ?? originalBitmap.Height))
                {
                    var x     = image.XOffset.Offset < 0 ? Math.Abs(image.XOffset.Offset) : 0;
                    var y     = image.YOffset.Offset < 0 ? Math.Abs(image.YOffset.Offset) : 0;
                    var width = image.Width ?? originalBitmap.Width;
                    if (width + x > originalBitmap.Width)
                    {
                        width = originalBitmap.Width - x;
                    }
                    var height = image.Height ?? originalBitmap.Height;
                    if (height + y > originalBitmap.Height)
                    {
                        height = originalBitmap.Height - y;
                    }
                    var offsetX = 0;
                    var offsetY = 0;
                    if (image.XOffset.Direction == Direction.Right)
                    {
                        if (originalBitmap.Width > width)
                        {
                            x = originalBitmap.Width - width;
                        }
                        else
                        {
                            offsetX = (image.Width ?? 0) - originalBitmap.Width;
                        }
                    }
                    else if (image.XOffset.Direction == Direction.Center && image.XOffset.PositionMode == PositionMode.Direction)
                    {
                        if (originalBitmap.Width > width)
                        {
                            x = (originalBitmap.Width - width) / 2;
                        }
                        else
                        {
                            offsetX = ((image.Width ?? 0) - originalBitmap.Width) / 2;
                        }
                    }
                    if (image.YOffset.Direction == Direction.Bottom)
                    {
                        if (originalBitmap.Height > height)
                        {
                            y = originalBitmap.Height - height;
                        }
                        else
                        {
                            offsetY = (image.Height ?? 0) - originalBitmap.Height;
                        }
                    }
                    else if (image.YOffset.Direction == Direction.Center && image.YOffset.PositionMode == PositionMode.Direction)
                    {
                        if (originalBitmap.Height > height)
                        {
                            y = (originalBitmap.Height - height) / 2;
                        }
                        else
                        {
                            offsetY = ((image.Height ?? 0) - originalBitmap.Height) / 2;
                        }
                    }

                    try
                    {
                        using (var bm = originalBitmap.Clone(new Rectangle(x, y, width, height), originalBitmap.PixelFormat))
                        {
                            writer.WriteImage(bm, offsetX, offsetY);
                        }
                    }
                    catch (OutOfMemoryException)
                    {
                        throw new InvalidOperationException(string.Format("Unable to Add {0} to Sprite.", image.OriginalImageUrl));
                    }
                    bitmap = writer.SpriteImage;
                    if ((originalBitmap.Width * originalBitmap.Height) > (bitmap.Width * bitmap.Height))
                    {
                        Size += writer.GetBytes("image/png").Length;
                    }
                    else
                    {
                        Size += imageBytes.Length;
                    }
                }
            }
            var avgColor     = rrConfiguration.IsFullTrust ? GetColors(bitmap) : 0;
            var spritedImage = new SpritedImage(avgColor, image, bitmap);

            images.Add(spritedImage);
            Width += bitmap.Width + 1;
            if (Height < bitmap.Height)
            {
                Height = bitmap.Height;
            }
            return(spritedImage);
        }
示例#22
0
 public SpritedImage(int averageColor, BackgroundImageClass cssClass, Bitmap Image)
 {
     AverageColor = averageColor;
     CssClass = cssClass;
     this.Image = Image;
 }
示例#23
0
 public ImageMetadata(BackgroundImageClass image)
     : this()
 {
     Url = image.ImageUrl;
     Width = image.Width ?? 0;
     Height = image.Height ?? 0;
     XOffset = image.XOffset.Offset;
     YOffset = image.YOffset.Offset;
 }
            public void WillSetYOffsetAsCenterWhenXOffsetIsDirectionAndYOffsetIsNotGiven(string xDirection)
            {
                var css =
                @"
                .LocalNavigation .TabOn,.LocalNavigation .TabOn:hover {{
                background: url(""http://i3.social.microsoft.com/contentservice/1f22465a-498c-46f1-83d3-9dad00d8a950/subnav_on_technet.png"") no-repeat {0};
                }}";

                var testable = new BackgroundImageClass(string.Format(css, xDirection), "http://server/content/style.css");

                Assert.Equal(PositionMode.Direction, testable.YOffset.PositionMode);
                Assert.Equal(Direction.Center, testable.YOffset.Direction);
            }
            public void WillSetYRepeatIfYRepeatIsSpecifiedLast()
            {
                var css =
                @"
                .LocalNavigation .TabOn,.LocalNavigation .TabOn:hover {
                background-image: url(""http://i3.social.microsoft.com/contentservice/1f22465a-498c-46f1-83d3-9dad00d8a950/subnav_on_technet.png"") no-repeat;
                background-repeat: y-repeat;
                }";

                var testable = new BackgroundImageClass(css, "http://server/content/style.css");

                Assert.Equal(RepeatStyle.YRepeat, testable.Repeat);
            }
            public void WillSetWidthFromWidthWhenLastPropertyWithNoSemicolon()
            {
                var css =
                @"
                .LocalNavigation .TabOn,.LocalNavigation .TabOn:hover {{
                background-image: url(""http://i3.social.microsoft.com/contentservice/1f22465a-498c-46f1-83d3-9dad00d8a950/subnav_on_technet.png"") no-repeat;
                width: 50px}}";

                var testable = new BackgroundImageClass(css, "http://server/content/style.css");

                Assert.Equal(50, testable.Width);
            }
            public void WillSetImageAbsoluteUrlFromBackgroundImageStyle(string css)
            {
                var testable = new BackgroundImageClass(css, "http://server/content/style.css");

                Assert.Equal("http://server/content/subnav_on_technet.png", testable.ImageUrl);
            }
示例#28
0
        public SpritedImage AddImage(BackgroundImageClass image)
        {
            byte[] imageBytes;
            if (DownloadedImages.ContainsKey(image.ImageUrl) && image.IsSprite)
            {
                imageBytes = DownloadedImages[image.ImageUrl];
            }
            else
            {
                imageBytes = webClientWrapper.DownloadBytes(image.ImageUrl);
                if (image.IsSprite)
                {
                    DownloadedImages.Add(image.ImageUrl, imageBytes);
                }
            }
            Bitmap bitmap;

            using (var originalBitmap = new Bitmap(new MemoryStream(imageBytes)))
            {
                var width  = image.Width ?? originalBitmap.Width; //cliped width of original image
                var height = image.Height ?? originalBitmap.Height;
                using (var writer = new SpriteWriter(width, height))
                {
                    var x          = image.XOffset.Offset < 0 ? Math.Abs(image.XOffset.Offset) : 0; //offset on original
                    var y          = image.YOffset.Offset < 0 ? Math.Abs(image.YOffset.Offset) : 0;
                    var imageWidth = width;                                                         //canvas width
                    if (width + x > originalBitmap.Width)
                    {
                        width = originalBitmap.Width - x;
                    }
                    var imageHeight = height;
                    if (height + y > originalBitmap.Height)
                    {
                        height = originalBitmap.Height - y;
                    }
                    var offsetX = 0;
                    var offsetY = 0;
                    if (image.XOffset.PositionMode == PositionMode.Direction)
                    {
                        switch (image.XOffset.Direction)
                        {
                        case Direction.Left:
                            image.XOffset = new Position {
                                PositionMode = PositionMode.Percent, Offset = 0
                            };
                            break;

                        case Direction.Center:
                            image.XOffset = new Position {
                                PositionMode = PositionMode.Percent, Offset = 50
                            };
                            break;

                        case Direction.Right:
                            image.XOffset = new Position {
                                PositionMode = PositionMode.Percent, Offset = 100
                            };
                            break;
                        }
                    }
                    if (image.YOffset.PositionMode == PositionMode.Direction)
                    {
                        switch (image.YOffset.Direction)
                        {
                        case Direction.Top:
                            image.YOffset = new Position {
                                PositionMode = PositionMode.Percent, Offset = 0
                            };
                            break;

                        case Direction.Center:
                            image.YOffset = new Position {
                                PositionMode = PositionMode.Percent, Offset = 50
                            };
                            break;

                        case Direction.Bottom:
                            image.YOffset = new Position {
                                PositionMode = PositionMode.Percent, Offset = 100
                            };
                            break;
                        }
                    }
                    if (image.XOffset.PositionMode == PositionMode.Percent)
                    {
                        if (originalBitmap.Width > imageWidth)
                        {
                            x = (int)Math.Round((originalBitmap.Width - imageWidth) * (image.XOffset.Offset / 100f), 0);
                        }
                        else
                        {
                            offsetX = (int)Math.Round((imageWidth - originalBitmap.Width) * (image.XOffset.Offset / 100f), 0);
                        }
                    }
                    else if (image.XOffset.PositionMode == PositionMode.Unit && image.XOffset.Offset > 0)
                    {
                        offsetX = image.XOffset.Offset;
                        if (originalBitmap.Width + offsetX > imageWidth)
                        {
                            width = imageWidth - offsetX;
                        }
                    }

                    if (image.YOffset.PositionMode == PositionMode.Percent)
                    {
                        if (originalBitmap.Height > imageHeight)
                        {
                            y = (int)Math.Round((originalBitmap.Height - height) * (image.YOffset.Offset / 100f), 0);
                        }
                        else
                        {
                            offsetY = (int)Math.Round((imageHeight - originalBitmap.Height) * (image.YOffset.Offset / 100f), 0);
                        }
                    }

                    try
                    {
                        using (var bm = originalBitmap.Clone(new Rectangle(x, y, width, height), originalBitmap.PixelFormat))
                        {
                            writer.WriteImage(bm, offsetX, offsetY);
                        }
                    }
                    catch (OutOfMemoryException)
                    {
                        throw new InvalidOperationException(string.Format("Unable to Add {0} to Sprite.", image.ImageUrl));
                    }
                    bitmap = writer.SpriteImage;
                    if ((originalBitmap.Width * originalBitmap.Height) > (bitmap.Width * bitmap.Height))
                    {
                        Size += writer.GetBytes("image/png").Length;
                    }
                    else
                    {
                        Size += imageBytes.Length;
                    }
                }
            }
            var avgColor     = rrConfiguration.IsFullTrust ? GetColors(bitmap) : 0;
            var spritedImage = new SpritedImage(avgColor, image, bitmap);

            Images.Add(spritedImage);
            Width += bitmap.Width + 1;
            if (Height < bitmap.Height)
            {
                Height = bitmap.Height;
            }
            return(spritedImage);
        }
示例#29
0
        public SpritedImage AddImage (BackgroundImageClass image)
        {
            byte[] imageBytes;
            if(DownloadedImages.ContainsKey(image.ImageUrl) && image.IsSprite)
                imageBytes = DownloadedImages[image.ImageUrl];
            else
            {
                imageBytes = webClientWrapper.DownloadBytes(image.ImageUrl);
                if(image.IsSprite)
                    DownloadedImages.Add(image.ImageUrl, imageBytes);
            }
            Bitmap bitmap;

            using (var originalBitmap = new Bitmap(new MemoryStream(imageBytes)))
            {
                var width = image.Width ?? originalBitmap.Width; //cliped width of original image
                var height = image.Height ?? originalBitmap.Height;
                using (var writer = new SpriteWriter(width, height))
                {
                    var x = image.XOffset.Offset < 0 ? Math.Abs(image.XOffset.Offset) : 0; //offset on original
                    var y = image.YOffset.Offset < 0 ? Math.Abs(image.YOffset.Offset) : 0;
                    var imageWidth = width; //canvas width
                    if (width + x > originalBitmap.Width)   
                        width = originalBitmap.Width - x;
                    var imageHeight = height;
                    if (height + y > originalBitmap.Height)
                        height = originalBitmap.Height - y;
                    var offsetX = 0;
                    var offsetY = 0;
                    if (image.XOffset.PositionMode == PositionMode.Direction)
                    {
                        switch (image.XOffset.Direction)
                        {
                            case Direction.Left:
                                image.XOffset = new Position { PositionMode = PositionMode.Percent, Offset = 0};
                                break;
                            case Direction.Center:
                                image.XOffset = new Position { PositionMode = PositionMode.Percent, Offset = 50};
                                break;
                            case Direction.Right:
                                image.XOffset = new Position { PositionMode = PositionMode.Percent, Offset = 100 };
                                break;
                        }
                    }
                    if (image.YOffset.PositionMode == PositionMode.Direction)
                        switch (image.YOffset.Direction)
                        {
                            case Direction.Top:
                                image.YOffset = new Position { PositionMode = PositionMode.Percent, Offset = 0 };
                                break;
                            case Direction.Center:
                                image.YOffset = new Position { PositionMode = PositionMode.Percent, Offset = 50 };
                                break;
                            case Direction.Bottom:
                                image.YOffset = new Position { PositionMode = PositionMode.Percent, Offset = 100 };
                                break;
                        }
                    if (image.XOffset.PositionMode == PositionMode.Percent)
                    {
                        if (originalBitmap.Width > imageWidth)
                            x = (int)Math.Round((originalBitmap.Width - imageWidth) * (image.XOffset.Offset / 100f), 0);
                        else
                            offsetX = (int)Math.Round((imageWidth - originalBitmap.Width) * (image.XOffset.Offset / 100f), 0);
                    }
                    else if (image.XOffset.PositionMode == PositionMode.Unit && image.XOffset.Offset > 0)
                    {
                        offsetX = image.XOffset.Offset;
                        if (originalBitmap.Width + offsetX > imageWidth)
                            width = imageWidth - offsetX;
                    }

                    if (image.YOffset.PositionMode == PositionMode.Percent)
                    {
                        if (originalBitmap.Height > imageHeight)
                            y = (int)Math.Round((originalBitmap.Height - height) * (image.YOffset.Offset / 100f), 0);
                        else
                            offsetY = (int)Math.Round((imageHeight - originalBitmap.Height) * (image.YOffset.Offset / 100f), 0);
                    }

                    try
                    {
                        using (var bm = originalBitmap.Clone(new Rectangle(x, y, width, height), originalBitmap.PixelFormat))
                        {
                            writer.WriteImage(bm, offsetX, offsetY);
                        }
                    }
                    catch (OutOfMemoryException)
                    {
                        throw new InvalidOperationException(string.Format("Unable to Add {0} to Sprite.", image.ImageUrl));
                    }
                    bitmap = writer.SpriteImage;
                    if ((originalBitmap.Width * originalBitmap.Height) > (bitmap.Width * bitmap.Height))
                        Size += writer.GetBytes("image/png").Length;
                    else
                        Size += imageBytes.Length;
                }
            }
            var avgColor = rrConfiguration.IsFullTrust ? GetColors(bitmap) : 0;
            var spritedImage = new SpritedImage(avgColor, image, bitmap);
            Images.Add(spritedImage);
            Width += bitmap.Width + 1;
            if (Height < bitmap.Height) Height = bitmap.Height;
            return spritedImage;
        }
            public void WillSetImportantIfShorthandpositionIsImportant()
            {
                var css =
                @"
                img.icon {
                background: url(""http://galchameleon.redmond.corp.microsoft.com/contentservice/d046de6b-2d8e-43ec-9b37-9f5d010e51dd/icons_windows.png"") no-repeat 0 0 !important;width: 20px;
                }}";

                var testable = new BackgroundImageClass(css, "http://server/content/style.css");

                Assert.True(testable.Important);
            }
            public void WillSetImportantIfLonghandpositionIsImportant()
            {
                var css =
                @"
                .LocalNavigation .TabOn,.LocalNavigation .TabOn:hover {{
                background: url(""http://i3.social.microsoft.com/contentservice/1f22465a-498c-46f1-83d3-9dad00d8a950/subnav_on_technet.png"") no-repeat;
                background-position:  50 60 !important
                }}";

                var testable = new BackgroundImageClass(css, "http://server/content/style.css");

                Assert.True(testable.Important);
            }
 public string InjectSprite(string originalCss, BackgroundImageClass image, Sprite sprite)
 {
     return originalCss.Replace(image.OriginalClassString, image.Render(sprite));
 }
            public void WillSetOriginalClassStringToPassedString()
            {
                var testable = new BackgroundImageClass("original string", "http://server/content/style.css");

                Assert.Equal("original string", testable.OriginalClassString);
            }
            public void WillSetOffsetsFromLastOffsets()
            {
                var css =
                @"
                .LocalNavigation .TabOn,.LocalNavigation .TabOn:hover {{
                background: url(""http://i3.social.microsoft.com/contentservice/1f22465a-498c-46f1-83d3-9dad00d8a950/subnav_on_technet.png"") no-repeat 0px 0px;
                background-position: 10px -33px;
                }}";

                var testable = new BackgroundImageClass(css, "http://server/content/style.css");

                Assert.Equal(PositionMode.Unit, testable.XOffset.PositionMode);
                Assert.Equal(10, testable.XOffset.Offset);
                Assert.Equal(PositionMode.Unit, testable.YOffset.PositionMode);
                Assert.Equal(-33, testable.YOffset.Offset);
            }
            public void WillSetWidthFromWidth(string statedWidth, int? expectedWidth)
            {
                var css =
                @"
                .LocalNavigation .TabOn,.LocalNavigation .TabOn:hover {{
                background-image: url(""http://i3.social.microsoft.com/contentservice/1f22465a-498c-46f1-83d3-9dad00d8a950/subnav_on_technet.png"") no-repeat;
                width: {0};
                }}";

                var testable = new BackgroundImageClass(string.Format(css, statedWidth), "http://server/content/style.css");

                Assert.Equal(expectedWidth, testable.Width);
            }