public void HorizontalyCenteredImagesLargerThanWidthWillBeCentered() { var testable = new TestableSpriteContainer(); var image1 = new BackgroundImageClass("", 0) { ImageUrl = "url1", ExplicitWidth = 10, XOffset = new Position() { PositionMode = PositionMode.Direction, Direction = Direction.Center } }; testable.Mock <IWebClientWrapper>().Setup(x => x.DownloadBytes("url1")).Returns(testable.Image18X18); testable.ClassUnderTest.AddImage(image1); var image = testable.ClassUnderTest.First(); var image2 = new Bitmap(new MemoryStream(testable.Image18X18)); Assert.Equal(image2.Clone(new Rectangle(4, 0, 10, 18), image2.PixelFormat).GraphicsImage(), image.Image.Clone(new Rectangle(0, 0, 10, 18), image2.PixelFormat), new BitmapPixelComparer(true)); }
public void RightPositionedImagesWillBeRightAlligned() { var testable = new TestableSpriteContainer(); var image1 = new BackgroundImageClass("", 0) { ImageUrl = "url1", ExplicitWidth = 30, XOffset = new Position() { PositionMode = PositionMode.Direction, Direction = Direction.Right } }; testable.Mock <IWebClientWrapper>().Setup(x => x.DownloadBytes("url1")).Returns(testable.Image15X17); testable.ClassUnderTest.AddImage(image1); var image = testable.ClassUnderTest.First(); var image2 = new Bitmap(new MemoryStream(testable.Image15X17)); Assert.Equal(image2.GraphicsImage(), image.Image.Clone(new Rectangle(15, 0, 15, 17), image2.PixelFormat), new BitmapPixelComparer(true)); }
public void WillNotCacheNonSprites() { var testable = new TestableSpriteContainer(); var image1 = new BackgroundImageClass("image1", 0) { ImageUrl = "url", IsSprite = true }; var image2 = new BackgroundImageClass("image2", 0) { ImageUrl = "url2", IsSprite = false }; testable.Mock <IWebClientWrapper>().Setup(x => x.DownloadBytes("url")).Returns(testable.Image15X17); testable.Mock <IWebClientWrapper>().Setup(x => x.DownloadBytes("url2")).Returns(testable.Image15X17); testable.ClassUnderTest.AddImage(image1); testable.ClassUnderTest.AddImage(image2); Assert.True(testable.ClassUnderTest.DownloadedImages.ContainsKey("url")); Assert.False(testable.ClassUnderTest.DownloadedImages.ContainsKey("url2")); }
public void WillAddSpriteToSpriteManager() { var testable = new TestableCssReducer(); testable.Mock <IWebClientWrapper>().Setup(x => x.DownloadString <CssResource>(It.IsAny <string>())).Returns("css"); var image1 = new BackgroundImageClass("", "http://server/content/style.css") { ImageUrl = "image1" }; var image2 = new BackgroundImageClass("", "http://server/content/style.css") { ImageUrl = "image2" }; var css = "css"; testable.Mock <ICssImageTransformer>().Setup(x => x.ExtractImageUrls(ref css, It.IsAny <string>())).Returns(new BackgroundImageClass[] { image1, image2 }); testable.ClassUnderTest.Process("http://host/css2.css"); testable.Mock <ISpriteManager>().Verify(x => x.Add(image1), Times.Once()); }
public void WillCopySpritesToContainerButAddDistinctCssClass() { var testable = new TestableSpriteManager(); var image = new BackgroundImageClass("", 0) { ImageUrl = "url", Selector = ".class" }; testable.ClassUnderTest.Add(image); var image2 = new BackgroundImageClass("", 0) { ImageUrl = "url", Selector = ".class2" }; testable.ClassUnderTest.Add(image2); Assert.Equal(2, testable.ClassUnderTest.SpriteList.Count); Assert.Equal(image, testable.ClassUnderTest.SpriteList[0].Value.CssClass); Assert.Equal(image2, testable.ClassUnderTest.SpriteList[1].Value.CssClass); Assert.Equal(testable.ClassUnderTest.SpriteList[0].Key, testable.ClassUnderTest.SpriteList[1].Key); }
public void WillCountUniqueColorsOfAddedImages() { var testable = new TestableSpriteContainer(); var fiveColorImage = new BackgroundImageClass("image1", "") { ImageUrl = "url" }; testable.Mock <IWebClientWrapper>().Setup(x => x.DownloadBytes("url")).Returns(TestableSpriteContainer.GetFiveColorImage()); var fourColorImage = new BackgroundImageClass("image2", "") { ImageUrl = "url2" }; testable.Mock <IWebClientWrapper>().Setup(x => x.DownloadBytes("url2")).Returns(TestableSpriteContainer.GetFourColorImage()); testable.ClassUnderTest.AddImage(fiveColorImage); testable.ClassUnderTest.AddImage(fourColorImage); Assert.Equal(7, testable.ClassUnderTest.Colors); }
public void HeightWillBeTheTallestOfAddedImages() { var testable = new TestableSpriteContainer(); var image1 = new BackgroundImageClass("", 0) { ImageUrl = "url1" }; var image2 = new BackgroundImageClass("", 0) { ImageUrl = "url2" }; testable.Mock <IWebClientWrapper>().Setup(Xunit => Xunit.DownloadBytes("url1")).Returns( testable.Image15X17); testable.Mock <IWebClientWrapper>().Setup(Xunit => Xunit.DownloadBytes("url2")).Returns( testable.Image18X18); testable.ClassUnderTest.AddImage(image1); testable.ClassUnderTest.AddImage(image2); Assert.Equal(18, testable.ClassUnderTest.Height); }
public void WillClipLeftEdgeOfBackgroundClassWhenOffsetIsNegative() { var testable = new TestableSpriteContainer(); var image1 = new BackgroundImageClass("", 0) { ImageUrl = "url1", ExplicitWidth = 5, XOffset = new Position() { PositionMode = PositionMode.Unit, Offset = -5 } }; testable.Mock <IWebClientWrapper>().Setup(x => x.DownloadBytes("url1")).Returns( testable.Image15X17); var bitMap = new Bitmap(new MemoryStream(testable.Image15X17)); testable.ClassUnderTest.AddImage(image1); Assert.Equal(bitMap.Clone(new Rectangle(5, 0, 5, 17), bitMap.PixelFormat).GraphicsImage(), testable.ClassUnderTest.First().Image, new BitmapPixelComparer(true)); }
public void WidthWillBeAggregateOfAddedImageWidthsPlusOnePixelEach() { var testable = new TestableSpriteContainer(); var image1 = new BackgroundImageClass("", 0) { ImageUrl = "url1" }; var image2 = new BackgroundImageClass("", 0) { ImageUrl = "url2" }; testable.Mock <IWebClientWrapper>().Setup(Xunit => Xunit.DownloadBytes("url1")).Returns( testable.Image15X17); testable.Mock <IWebClientWrapper>().Setup(Xunit => Xunit.DownloadBytes("url2")).Returns( testable.Image18X18); testable.ClassUnderTest.AddImage(image1); testable.ClassUnderTest.AddImage(image2); Assert.Equal(35, testable.ClassUnderTest.Width); }
public void WillNotClipUpperEdgeOfBackgroundClassWhenOffsetIsPositive() { var testable = new TestableSpriteContainer(); var image1 = new BackgroundImageClass("", "http://server/content/style.css") { ImageUrl = "url1", Height = 5, YOffset = new Position() { PositionMode = PositionMode.Percent, Offset = 50 } }; testable.Mock <IWebClientWrapper>().Setup(x => x.DownloadBytes("url1")).Returns( testable.Image15X17); var bitMap = new Bitmap(new MemoryStream(testable.Image15X17)); testable.ClassUnderTest.AddImage(image1); Assert.Equal(bitMap.Clone(new Rectangle(0, 0, 15, 5), bitMap.PixelFormat).GraphicsImage(), testable.ClassUnderTest.First().Image, new BitmapPixelComparer(true)); }
public void SizeWillBeAggregateOfAddedImages() { var testable = new TestableSpriteContainer(); var image1 = new BackgroundImageClass("", "http://server/content/style.css") { ImageUrl = "url1" }; var image2 = new BackgroundImageClass("", "http://server/content/style.css") { ImageUrl = "url2" }; testable.Mock <IWebClientWrapper>().Setup(Xunit => Xunit.DownloadBytes("url1")).Returns( testable.Image15X17); testable.Mock <IWebClientWrapper>().Setup(Xunit => Xunit.DownloadBytes("url2")).Returns( testable.Image18X18); testable.ClassUnderTest.AddImage(image1); testable.ClassUnderTest.AddImage(image2); Assert.Equal(testable.Image15X17.Length + testable.Image18X18.Length, testable.ClassUnderTest.Size); }
public void WillNotSpriteImagesWhenSpritingIsDisabled() { var testable = new TestableCssReducer(); testable.Mock <IWebClientWrapper>().Setup(x => x.DownloadString <CssResource>(It.IsAny <string>())).Returns("css"); testable.Mock <IRRConfiguration>().Setup(x => x.ImageSpritingDisabled).Returns(true); var image1 = new BackgroundImageClass("", 0) { ImageUrl = "image1" }; var image2 = new BackgroundImageClass("", 0) { ImageUrl = "image2" }; var css = "css"; testable.Mock <ICssImageTransformer>().Setup(x => x.ExtractImageUrls(css)).Returns(new BackgroundImageClass[] { image1, image2 }); testable.ClassUnderTest.Process("http://host/css2.css"); testable.Mock <ISpriteManager>().Verify(x => x.Add(image1), Times.Never()); }
public void UniqueColorsOfAddedImagesWillBe0WhenNotInFullTrust() { var testable = new TestableSpriteContainer(); var fiveColorImage = new BackgroundImageClass("image1", "") { ImageUrl = "url" }; testable.Mock <IWebClientWrapper>().Setup(x => x.DownloadBytes("url")).Returns(TestableSpriteContainer.GetFiveColorImage()); var fourColorImage = new BackgroundImageClass("image2", "") { ImageUrl = "url2" }; testable.Mock <IWebClientWrapper>().Setup(x => x.DownloadBytes("url2")).Returns(TestableSpriteContainer.GetFourColorImage()); testable.Mock <IRRConfiguration>().Setup(x => x.IsFullTrust).Returns(false); testable.ClassUnderTest.AddImage(fiveColorImage); testable.ClassUnderTest.AddImage(fourColorImage); Assert.Equal(0, testable.ClassUnderTest.Colors); }
public void WillSetImageAbsoluteUrlFromBackgroundImageStyleAndReplaceRelativeUrl() { var css = @" .LocalNavigation .TabOn,.LocalNavigation .TabOn:hover { background-image: url(""subnav_on_technet.png""); }"; var expectedCss = @" .LocalNavigation .TabOn,.LocalNavigation .TabOn:hover { background-image: url(""newUrl""); ;background-position: -0px 0;}"; var testable = new TestableCssImageTransformer(); var backgroundImage = new BackgroundImageClass(css, 0); var sprite = new SpritedImage(1, backgroundImage, null) { Url = "newUrl", Position = 0 }; var result = testable.ClassUnderTest.InjectSprite(css, sprite); Assert.Equal(expectedCss, result); }
public void PositivelyXOffsetImagesWillBecorrectlyPositionedInClonedImageSentToWriter() { var testable = new TestableSpriteContainer(); var image1 = new BackgroundImageClass("", 0) { ImageUrl = "url1", ExplicitWidth = 30, ExplicitHeight = 30, XOffset = new Position() { PositionMode = PositionMode.Unit, Offset = 5 }, YOffset = new Position() { PositionMode = PositionMode.Unit, Offset = 0 } }; testable.Mock <IWebClientWrapper>().Setup(x => x.DownloadBytes("url1")).Returns(testable.Image18X18); testable.ClassUnderTest.AddImage(image1); var image = testable.ClassUnderTest.First(); var image2 = new Bitmap(new MemoryStream(testable.Image18X18)); Assert.Equal(image2.GraphicsImage(), image.Image.Clone(new Rectangle(5, 0, 18, 18), image2.PixelFormat), new BitmapPixelComparer(true)); }
public void BottomPositionedImagesLargerThanHeightWillBeBottomAlligned() { var testable = new TestableSpriteContainer(); var image1 = new BackgroundImageClass("", "http://server/content/style.css") { ImageUrl = "url1", Width = 10, Height = 10, XOffset = new Position() { PositionMode = PositionMode.Direction, Direction = Direction.Right }, YOffset = new Position() { PositionMode = PositionMode.Direction, Direction = Direction.Bottom } }; testable.Mock <IWebClientWrapper>().Setup(x => x.DownloadBytes("url1")).Returns(testable.Image15X17); testable.ClassUnderTest.AddImage(image1); var image = testable.ClassUnderTest.First(); var image2 = new Bitmap(new MemoryStream(testable.Image15X17)); Assert.Equal(image2.Clone(new Rectangle(5, 7, 10, 10), image2.PixelFormat).GraphicsImage(), image.Image.Clone(new Rectangle(0, 0, 10, 10), image2.PixelFormat), new BitmapPixelComparer(true)); }
public void WillReturnAllImages() { var testable = new TestableSpriteContainer(); var image1 = new BackgroundImageClass("", "http://server/content/style.css") { ImageUrl = "url1" }; var image2 = new BackgroundImageClass("", "http://server/content/style.css") { ImageUrl = "url2" }; testable.Mock <IWebClientWrapper>().Setup(x => x.DownloadBytes("url1")).Returns( testable.Image15X17); testable.Mock <IWebClientWrapper>().Setup(x => x.DownloadBytes("url2")).Returns( testable.Image18X18); testable.ClassUnderTest.AddImage(image1); testable.ClassUnderTest.AddImage(image2); Assert.Contains(image1, testable.ClassUnderTest.Select(x => x.CssClass)); Assert.Contains(image2, testable.ClassUnderTest.Select(x => x.CssClass)); }
public void VerticallyCenteredImagesWillBeCenteredInClonedImageSentToWriter() { var testable = new TestableSpriteContainer(); var image1 = new BackgroundImageClass("", "http://server/content/style.css") { ImageUrl = "url1", Width = 30, Height = 30, XOffset = new Position() { PositionMode = PositionMode.Direction, Direction = Direction.Center }, YOffset = new Position() { PositionMode = PositionMode.Direction, Direction = Direction.Center } }; testable.Mock <IWebClientWrapper>().Setup(x => x.DownloadBytes("url1")).Returns(testable.Image18X18); testable.ClassUnderTest.AddImage(image1); var image = testable.ClassUnderTest.First(); var image2 = new Bitmap(new MemoryStream(testable.Image18X18)); Assert.Equal(image2.GraphicsImage(), image.Image.Clone(new Rectangle(6, 6, 18, 18), image2.PixelFormat), new BitmapPixelComparer(true)); }
public void WillReplaceOriginalCssWithAbsoluteUrl(string css) { var testable = new BackgroundImageClass(css, "http://server/content/style.css"); Assert.Equal(css.Replace("subnav_on_technet.png", testable.ImageUrl), testable.OriginalClassString); }
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); }
public void WillSetOriginalClassStringToPassedString() { var testable = new BackgroundImageClass("original string", "http://server/content/style.css"); Assert.Equal("original string", testable.OriginalClassString); }
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 SpriteFilterContext(BackgroundImageClass image) { BackgroundImage = image; }
public SpritedImage AddImage(BackgroundImageClass image) { byte[] imageBytes; if (DownloadedImages.ContainsKey(image.ImageUrl) && image.IsSprite) { imageBytes = DownloadedImages[image.ImageUrl]; } else { imageBytes = ImageLoader.GetImageBytes(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 = settings.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); }
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); }