RoundRectangle.vb
''
'' This code is part of GrapeCity Documents for Imaging samples.
'' Copyright (c) GrapeCity, Inc. All rights reserved.
''
Imports System.IO
Imports System.Drawing
Imports System.Numerics
Imports GrapeCity.Documents.Drawing
Imports GrapeCity.Documents.Text
Imports GrapeCity.Documents.Imaging

'' This sample demonstrates how to draw round rectangles
'' using dedicated DrawRoundRect/FillRoundRect methods.
'' It also shows how the same result may be achieved with
'' graphics paths.
Public Class RoundRectangle
    Function GenerateImage(
            Optional pixelWidth As Integer = 1024,
            Optional pixelHeight As Integer = 1024,
            Optional opaque As Boolean = True,
            Optional dpiX As Single = 96,
            Optional dpiY As Single = 96) As GcBitmap
        Dim bmp = New GcBitmap(pixelWidth, pixelHeight, True, dpiX, dpiY)
        Dim Inch = dpiX
        Using g = bmp.CreateGraphics(Color.RoyalBlue)
            Dim rc = Util.AddNote(
                "GcGraphics has dedicated methods to easily draw and fill rectangles with rounded corners. " +
                "This sample also shows how the same result may be achieved using graphics paths. " +
                "While they are not really needed for drawing round rectangles, graphics paths allow " +
                "to draw and fill arbitrary figures with complex geometries.",
                g)

            '' Rounded rectangle's radii:
            Dim rx = 36, ry = 24

            '' Using dedicated methods to draw And fill round rectangles:
            Dim rEasy = New RectangleF(rc.Left, rc.Bottom + Inch / 2, Inch * 2, Inch)
            g.FillRoundRect(rEasy, rx, ry, Color.PaleGreen)
            g.DrawRoundRect(rEasy, rx, ry, Color.Blue, 4)
            '' Add a label:
            Dim tf = New TextFormat() With
            {
                .Font = Font.FromFile(IO.Path.Combine("Resources", "Fonts", "times.ttf")),
                .FontSize = Inch / 6
            }
            g.DrawString("The easy way.", tf, rEasy, TextAlignment.Center, ParagraphAlignment.Center, False)

            '' Using graphics path to achieve the same result:
            Dim rHard = rEasy
            rHard.Offset(0, rEasy.Height + Inch / 2)
            Dim path = MakeRoundRect(g, rHard, rx, ry)
            g.FillPath(path, Color.PaleVioletRed)
            g.DrawPath(path, Color.Purple, 4)
            '' Add a label:
            g.DrawString("The hard way.", tf, rHard, TextAlignment.Center, ParagraphAlignment.Center, False)
        End Using
        '' Done
        Return bmp
    End Function

    '' This method shows how to create a graphics path that may be used
    '' to fill Or draw arbitrary shapes on a GcGraphics.
    Private Function MakeRoundRect(ByVal g As GcGraphics, ByVal rc As RectangleF, ByVal rx As Single, ByVal ry As Single) As IPath
        Dim path = g.CreatePath()
        Dim sz = New SizeF(rx, ry)
        '' start from horizontal top left
        path.BeginFigure(New PointF(rc.Left + rx, rc.Top))
        path.AddLine(New PointF(rc.Right - rx, rc.Top))
        path.AddArc(New ArcSegment() With {.Point = New PointF(rc.Right, rc.Top + ry), .SweepDirection = SweepDirection.Clockwise, .Size = sz})
        path.AddLine(New PointF(rc.Right, rc.Bottom - ry))
        path.AddArc(New ArcSegment() With {.Point = New PointF(rc.Right - rx, rc.Bottom), .SweepDirection = SweepDirection.Clockwise, .Size = sz})
        path.AddLine(New PointF(rc.Left + rx, rc.Bottom))
        path.AddArc(New ArcSegment() With {.Point = New PointF(rc.Left, rc.Bottom - ry), .SweepDirection = SweepDirection.Clockwise, .Size = sz})
        path.AddLine(New PointF(rc.Left, rc.Top + ry))
        path.AddArc(New ArcSegment() With {.Point = New PointF(rc.Left + rx, rc.Top), .SweepDirection = SweepDirection.Clockwise, .Size = sz})
        path.EndFigure(FigureEnd.Closed)
        Return path
    End Function
End Class