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

'' アウトラインテキストの作成
Public Class OutlinedText
    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, opaque, dpi, dpi)
        Using g = bmp.CreateGraphics(Color.White)
            Dim tl = g.CreateTextLayout()

            '' テキストレイアウトを設定します。
            tl.MaxWidth = g.Width
            tl.MaxHeight = g.Height
            tl.MarginAll = g.Resolution / 2
            Const fontSize = 64

            Dim rcBack = New RectangleF(0, 0, pixelSize.Width, pixelSize.Height)
            g.DrawImage(GCDRAW.Image.FromFile(Path.Combine("Resources", "Images", "purples.jpg")), rcBack, Nothing, ImageAlign.StretchImage)

            Dim tf0 = New TextFormat() With
            {
                .ForeColor = Color.LemonChiffon,
                .Hollow = True,
                .Font = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "NotoSans-Bold.ttf")),
                .FontSize = fontSize
            }
            tl.AppendLine("Hollow Text", tf0)

            Dim tf1 = New TextFormat() With
            {
                .StrokePen = Color.DarkMagenta,
                .FillBrush = New GCDRAW.SolidBrush(Color.Yellow),
                .Font = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "FoglihtenNo07.otf")),
                .FontSize = fontSize
            }
            tl.AppendLine("Outlined Text", tf1)

            Dim grad0 = New LinearGradientBrush(Color.Red, New PointF(0, 0), Color.Blue, New PointF(1, 0))
            Dim tf2 = New TextFormat() With
            {
                .FillBrush = grad0,
                .Font = tf0.Font,
                .FontSize = fontSize
            }
            tl.AppendLine("Gradient Fill", tf2)

            Dim grad1 = New LinearGradientBrush(Color.Red, Color.Purple)
            grad1.GradientStops = New List(Of GradientStop)() From
            {
                New GradientStop(Color.Orange, 1 / 6.0F),
                New GradientStop(Color.Yellow, 2 / 6.0F),
                New GradientStop(Color.Green, 3 / 6.0F),
                New GradientStop(Color.Cyan, 4 / 6.0F),
                New GradientStop(Color.Blue, 5 / 6.0F)
            }
            Dim tf3 = New TextFormat() With
            {
                .FillBrush = grad1,
                .Font = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "NotoSerif-Bold.ttf")),
                .FontSize = fontSize
            }
            tl.AppendLine("Multi-stop gradient", tf3)

            Dim tf4 = New TextFormat(tf3)
            tf4.StrokePen = Color.GreenYellow
            tl.AppendLine("Multi-stop gradient with outline", tf4)

            Dim tf5 = New TextFormat(tf4)
            tf5.Hollow = True
            tf5.StrokePen = New GCDRAW.Pen(Color.DarkRed, g.Resolution / 72)
            tl.AppendLine("Text outlined with 1pt wide pen", tf5)

            '' 新しく作成された TextLayout や、TextLayout.Clear() を呼び出した後では、
            '' PerformLayout() を呼び出す必要はありません。
            g.DrawTextLayout(tl, PointF.Empty)
        End Using

        Return bmp
    End Function
End Class