/// <summary> /// Draw the background image at the required location repeating it over the X and Y axis.<br/> /// Adjust location to left-top if starting location doesn't include all the range (adjusted to center or bottom/right). /// </summary> private static void DrawRepeat(IGraphics g, ImageLoadHandler imageLoadHandler, RectangleF rectangle, Rectangle srcRect, Rectangle destRect, Size imgSize) { while (destRect.X > rectangle.X) destRect.X -= imgSize.Width; while (destRect.Y > rectangle.Y) destRect.Y -= imgSize.Height; using (var brush = new TextureBrush(imageLoadHandler.Image, srcRect)) { brush.TranslateTransform(destRect.X, destRect.Y); g.FillRectangle(brush, rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height); } }
/// <summary> /// Draw the background image at the required location repeating it over the Y axis.<br/> /// Adjust location to top if starting location doesn't include all the range (adjusted to center or bottom). /// </summary> private static void DrawRepeatY(IGraphics g, ImageLoadHandler imageLoadHandler, RectangleF rectangle, Rectangle srcRect, Rectangle destRect, Size imgSize) { while (destRect.Y > rectangle.Y) { destRect.Y -= imgSize.Height; } using (var brush = new TextureBrush(imageLoadHandler.Image, srcRect)) { brush.TranslateTransform(destRect.X, destRect.Y); g.FillRectangle(brush, destRect.X, rectangle.Y, srcRect.Width, rectangle.Height); } }
/// <summary> /// Draw the background image of the given box in the given rectangle.<br/> /// Handle background-repeat and background-position values. /// </summary> /// <param name="g">the device to draw into</param> /// <param name="box">the box to draw its background image</param> /// <param name="imageLoadHandler">the handler that loads image to draw</param> /// <param name="rectangle">the rectangle to draw image in</param> public static void DrawBackgroundImage(IGraphics g, CssBox box, ImageLoadHandler imageLoadHandler, RectangleF rectangle) { // image size depends if specific rectangle given in image loader var imgSize = new Size(imageLoadHandler.Rectangle == Rectangle.Empty ? imageLoadHandler.Image.Width : imageLoadHandler.Rectangle.Width, imageLoadHandler.Rectangle == Rectangle.Empty ? imageLoadHandler.Image.Height : imageLoadHandler.Rectangle.Height); // get the location by BackgroundPosition value var location = GetLocation(box.BackgroundPosition, rectangle, imgSize); var srcRect = imageLoadHandler.Rectangle == Rectangle.Empty ? new Rectangle(0, 0, imgSize.Width, imgSize.Height) : new Rectangle(imageLoadHandler.Rectangle.Left, imageLoadHandler.Rectangle.Top, imgSize.Width, imgSize.Height); // initial image destination rectangle var destRect = new Rectangle(location, imgSize); // need to clip so repeated image will be cut on rectangle var prevClip = g.GetClip(); var lRectangle = rectangle; lRectangle.Intersect(prevClip); g.SetClip(lRectangle); switch (box.BackgroundRepeat) { case "no-repeat": g.DrawImage(imageLoadHandler.Image, destRect, srcRect); break; case "repeat-x": DrawRepeatX(g, imageLoadHandler, rectangle, srcRect, destRect, imgSize); break; case "repeat-y": DrawRepeatY(g, imageLoadHandler, rectangle, srcRect, destRect, imgSize); break; default: DrawRepeat(g, imageLoadHandler, rectangle, srcRect, destRect, imgSize); break; } g.SetClip(prevClip); }
/// <summary> /// Draw the background image of the given box in the given rectangle.<br/> /// Handle background-repeat and background-position values. /// </summary> /// <param name="g">the device to draw into</param> /// <param name="box">the box to draw its background image</param> /// <param name="imageLoadHandler">the handler that loads image to draw</param> /// <param name="rectangle">the rectangle to draw image in</param> public static void DrawBackgroundImage(IGraphics g, CssBox box, ImageLoadHandler imageLoadHandler, RectangleF rectangle) { // image size depends if specific rectangle given in image loader var imgSize = new Size(imageLoadHandler.Rectangle == Rectangle.Empty ? imageLoadHandler.Image.Width : imageLoadHandler.Rectangle.Width, imageLoadHandler.Rectangle == Rectangle.Empty ? imageLoadHandler.Image.Height : imageLoadHandler.Rectangle.Height); // get the location by BackgroundPosition value var location = GetLocation(box.BackgroundPosition, rectangle, imgSize); var srcRect = imageLoadHandler.Rectangle == Rectangle.Empty ? new Rectangle(0, 0, imgSize.Width, imgSize.Height) : new Rectangle(imageLoadHandler.Rectangle.Left, imageLoadHandler.Rectangle.Top, imgSize.Width, imgSize.Height); // initial image destination rectangle var destRect = new Rectangle(location, imgSize); // need to clip so repeated image will be cut on rectangle var prevClip = g.GetClip(); var lRectangle = rectangle; lRectangle.Intersect(prevClip); g.SetClip(lRectangle); switch( box.BackgroundRepeat ) { case "no-repeat": g.DrawImage(imageLoadHandler.Image, destRect, srcRect); break; case "repeat-x": DrawRepeatX(g, imageLoadHandler, rectangle, srcRect, destRect, imgSize); break; case "repeat-y": DrawRepeatY(g, imageLoadHandler, rectangle, srcRect, destRect, imgSize); break; default: DrawRepeat(g, imageLoadHandler, rectangle, srcRect, destRect, imgSize); break; } g.SetClip(prevClip); }
/// <summary> /// Assigns words its width and height /// </summary> /// <param name="g">the device to use</param> internal override void MeasureWordsSize(IGraphics g) { if (!_wordsSizeMeasured) { if (_imageLoadHandler == null && HtmlContainer.AvoidImagesLateLoading) { _imageLoadHandler = new ImageLoadHandler(OnLoadImageComplete); _imageLoadHandler.LoadImage(HtmlContainer, GetAttribute("src"), HtmlTag != null ? HtmlTag.Attributes : null); } MeasureWordSpacing(g); _wordsSizeMeasured = true; } CssLayoutEngine.MeasureImageSize(_imageWord); }
/// <summary> /// Paints the fragment /// </summary> /// <param name="g">the device to draw to</param> protected override void PaintImp(IGraphics g) { // load image iff it is in visible rectangle if (_imageLoadHandler == null) { _imageLoadHandler = new ImageLoadHandler(OnLoadImageComplete); _imageLoadHandler.LoadImage(HtmlContainer, GetAttribute("src"), HtmlTag != null ? HtmlTag.Attributes : null); } var rect = CommonUtils.GetFirstValueOrDefault(Rectangles); PointF offset = HtmlContainer.ScrollOffset; rect.Offset(offset); var prevClip = RenderUtils.ClipGraphicsByOverflow(g, this); PaintBackground(g, rect, true, true); BordersDrawHandler.DrawBoxBorders(g, this, rect, true, true); RectangleF r = _imageWord.Rectangle; r.Offset(offset); r.Height -= ActualBorderTopWidth + ActualBorderBottomWidth + ActualPaddingTop + ActualPaddingBottom; r.Y += ActualBorderTopWidth + ActualPaddingTop; if (_imageWord.Image != null) { if (_imageWord.ImageRectangle == Rectangle.Empty) g.DrawImage(_imageWord.Image, Rectangle.Round(r)); else g.DrawImage(_imageWord.Image, Rectangle.Round(r), _imageWord.ImageRectangle); if (_imageWord.Selected) { g.FillRectangle(GetSelectionBackBrush(true), _imageWord.Left + offset.X, _imageWord.Top + offset.Y, _imageWord.Width+2, DomUtils.GetCssLineBoxByWord(_imageWord).LineHeight); } } else if (_imageLoadingComplete) { if (_imageLoadingComplete && r.Width > 19 && r.Height > 19) { RenderUtils.DrawImageErrorIcon(g, r); } } else { RenderUtils.DrawImageLoadingIcon(g, r); if (r.Width > 19 && r.Height > 19) { g.DrawRectangle(Pens.LightGray, r.X, r.Y, r.Width, r.Height); } } RenderUtils.ReturnClip(g, prevClip); }
/// <summary> /// Create image handler for downloading video image if found and release the WebClient instance used for API call. /// </summary> private void HandlePostApiCall(object sender) { try { if (_videoImageUrl != null) { _imageLoadHandler = new ImageLoadHandler(OnLoadImageComplete); _imageLoadHandler.LoadImage(HtmlContainer, _videoImageUrl, HtmlTag != null ? HtmlTag.Attributes : null); } else { _imageLoadingComplete = true; SetErrorBorder(); } var webClient = (WebClient)sender; webClient.DownloadStringCompleted -= OnDownloadYoutubeApiCompleted; webClient.DownloadStringCompleted -= OnDownloadVimeoApiCompleted; webClient.Dispose(); HtmlContainer.RequestRefresh(IsLayoutRequired()); } catch {} }
/// <summary> /// Assigns words its width and height /// </summary> /// <param name="g"></param> internal virtual void MeasureWordsSize(IGraphics g) { if (!_wordsSizeMeasured) { if (BackgroundImage != CssConstants.None && _imageLoadHandler == null) { _imageLoadHandler = new ImageLoadHandler(OnImageLoadComplete); _imageLoadHandler.LoadImage(HtmlContainer, BackgroundImage, HtmlTag != null ? HtmlTag.Attributes : null); } MeasureWordSpacing(g); if (Words.Count > 0) { foreach (var boxWord in Words) { boxWord.Width = boxWord.Text != "\n" ? FontsUtils.MeasureStringWidth(g, boxWord.Text, ActualFont) : 0; boxWord.Height = FontsUtils.GetFontHeight(ActualFont); } } _wordsSizeMeasured = true; } }