''
'' This code is part of Document Solutions for Imaging demos.
'' Copyright (c) MESCIUS inc. All rights reserved.
''
Imports System
Imports System.IO
Imports System.Drawing
Imports System.Collections.Generic
Imports System.Linq
Imports System.Numerics
Imports GrapeCity.Documents.Drawing
Imports GrapeCity.Documents.Text
Imports GrapeCity.Documents.Imaging
Imports GrapeCity.Documents.Svg
Imports GCTEXT = GrapeCity.Documents.Text
Imports GCDRAW = GrapeCity.Documents.Drawing
'' 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.
Public Class ScaleSvg
Public Function GenerateImage(
ByVal pixelSize As Size,
ByVal dpi As Single,
ByVal opaque As Boolean,
Optional ByVal sampleParams As String() = Nothing) As GcBitmap
Dim svgPath = Path.Combine("Resources", "SvgMisc", "Smiling-Girl-offset.svg")
Using svg = GcSvgDocument.FromFile(svgPath)
'' Create the bitmap:
Dim bmp = New GcBitmap(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 As Single = 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 = New RectangleF(-contentRc.X, -contentRc.Y, s.Width, s.Height)
'' Set up padding:
Const pad As Single = 12
rc.Offset(pad, pad)
'' Scale down, limit number of iterations for sanity:
Const qDown As Single = 0.8F
Dim currRc = rc
Dim currContentRc = contentRc
While (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 *= qDown
End While
'' Scale up:
Const qUp As Single = 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 *= qUp
End While
'' Done:
Return bmp
End Using
End Using
End Function
End Class