'''' This code is part of Document Solutions for Imaging demos.'' Copyright (c) MESCIUS inc. All rights reserved.''ImportsSystemImportsSystem.IOImportsSystem.DrawingImportsSystem.Collections.GenericImportsSystem.LinqImportsSystem.NumericsImportsGrapeCity.Documents.DrawingImportsGrapeCity.Documents.TextImportsGrapeCity.Documents.ImagingImportsGrapeCity.Documents.Svg '' This sample shows how to measure and scale the actual content of an SVG image.'' It uses a sample SVG with intrinsic size larger than the actual content,'' and content that is offset within the viewport.'''' The same SVG is used to illustrate the difference between various SVG sizes in RenderSvgContent sample.'''' The SVG art used in this sample is from freesvg.org.PublicClassScaleSvgPublicFunctionGenerateImage(ByVal pixelSize AsSize,ByVal dpi AsSingle,ByVal opaque AsBoolean,OptionalByVal sampleParams AsString() = Nothing) AsGcBitmap Dim svgPath = Path.Combine("Resources", "SvgMisc", "Smiling-Girl-offset.svg")Using svg = GcSvgDocument.FromFile(svgPath) '' Create the bitmap:Dim bmp = NewGcBitmap(pixelSize.Width, pixelSize.Height, opaque, dpi, dpi)Using g = bmp.CreateGraphics(Color.White) '' Get the actual SVG image content bounds:Dim contentRc = g.MeasureSvg(svg, PointF.Empty) '' Make sure the SVG content fits height-wise twice:Dim q AsSingle = pixelSize.Height / (contentRc.Height * 2.1F) contentRc.X *= q contentRc.Y *= q contentRc.Width *= q contentRc.Height *= q '' Align the actual SVG content to point (0,0):Dim s = svg.GetIntrinsicSize(SvgLengthUnits.Pixels) s.Width *= q s.Height *= q'' This rectangle (in pixels) is similar to the SVG view port.'' It is also scaled so that the SVG content fits twice heightwise,'' and the actual SVG content's top left corner is at the top left corner'' of the rectangle:Dim rc = NewRectangleF(-contentRc.X, -contentRc.Y, s.Width, s.Height) '' Set up padding:ConstpadAsSingle = 12 rc.Offset(pad, pad) '' Scale down, limit number of iterations for sanity:ConstqDownAsSingle = 0.8FDim currRc = rcDim currContentRc = contentRcWhile (currRc.X + currContentRc.Right < pixelSize.Width) AndAlso (currContentRc.Height > 8) g.DrawSvg(svg, currRc)'' Draw content bounds if debugging:'' Dim trc = currContentRc'' trc.Offset(currRc.Location)'' g.DrawRectangle(trc, Color.MediumPurple)'' Scale SVG content down: currRc.Height = currRc.Height * qDown currRc.Width = currRc.Width * qDown currRc.Y -= (currContentRc.Top * qDown - currContentRc.Top) currRc.X += currContentRc.Width + currContentRc.Left - currContentRc.Left * qDown currContentRc.X *= qDown currContentRc.Y *= qDown currContentRc.Width *= qDown currContentRc.Height *= qDownEndWhile '' Scale up:ConstqUpAsSingle = 1.2F currRc = rc currContentRc = contentRc currRc.Offset(0, pixelSize.Height - contentRc.Height - pad * 2)While (currRc.X + currContentRc.Right < pixelSize.Width) g.DrawSvg(svg, currRc)'' Draw content bounds if debugging:'' Dim trc = currContentRc'' trc.Offset(currRc.Location)'' g.DrawRectangle(trc, Color.MediumPurple)'' Scale SVG content up: currRc.Height = currRc.Height * qUp currRc.Width = currRc.Width * qUp currRc.Y -= (currContentRc.Bottom * qUp - currContentRc.Bottom) currRc.X += currContentRc.Width + currContentRc.Left - currContentRc.Left * qUp currContentRc.X *= qUp currContentRc.Y *= qUp currContentRc.Width *= qUp currContentRc.Height *= qUpEndWhile '' Done:Return bmpEndUsingEndUsingEndFunctionEndClass