RoundRectangle.vb
'' 
'' このコードは、DioDocs for Imaging のサンプルの一部として提供されています。
'' © MESCIUS 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
Imports GCTEXT = GrapeCity.Documents.Text
Imports GCDRAW = GrapeCity.Documents.Drawing

'' このサンプルでは、専用の ​​DrawRoundRect/FillRoundRect メソッドを使用して角丸四角形を描画する方法を示します。
'' また、グラフィックパスを使用して同じ結果を実現する方法も示します。
Public Class RoundRectangle
    Function GenerateImage(
        ByVal pixelSize As Size,
        ByVal dpi As Single,
        ByVal opaque As Boolean,
        Optional ByVal sampleParams As String() = Nothing) As GcBitmap

        Dim bmp = New GcBitmap(pixelSize.Width, pixelSize.Height, True, dpi, dpi)
        Dim Inch = dpi
        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)

            '' 角丸長方形の半径を設定します。
            Dim rx = 36, ry = 24

            '' 専用メソッドを使用して角丸長方形を描画し、塗りつぶします。
            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)
            '' ラベルを追加します。
            Dim tf = New TextFormat() With
            {
                .Font = GCTEXT.Font.FromFile(IO.Path.Combine("Resources", "Fonts", "FreeSerif.ttf")),
                .FontSize = Inch / 6
            }
            g.DrawString("The easy way.", tf, rEasy, TextAlignment.Center, ParagraphAlignment.Center, False)

            '' グラフィックスパスを使用して同じ結果を作成します。
            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)
            '' ラベルを追加します。
            g.DrawString("The hard way.", tf, rHard, TextAlignment.Center, ParagraphAlignment.Center, False)
        End Using
        '' 画像ファイルを保存します。
        Return bmp
    End Function

    '' このメソッドは、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)
        '' 左上(水平方向の開始点)から開始します。
        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