JapaneseText.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 shows how to draw Japanese text on a GcBitmap.
Public Class JapaneseText
    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 Text = "日本語(にほんご、にっぽんご)は、主として、日本列島で使用されてきた言語である。日本手話を母語とする者などを除いて、ほぼ全ての日本在住者は日本語を第一言語とする。日本国は法令上、公用語を明記していないが、事実上の公用語となっており、学校教育の「国語」で教えられる。使用者は、日本国内を主として約\uFF11億\uFF13千万人。日本語の文法体系や音韻体系を反映する手話として日本語対応手話がある。"
        Dim ia = New ImageAlign(ImageAlignHorz.Left, ImageAlignVert.Top, True, True, True, False, False)

        Dim pageWidth = pixelWidth
        Dim pageHeight = pixelHeight

        Dim bmp = New GcBitmap(pixelWidth, pixelHeight, True, dpiX, dpiY)
        Using g = bmp.CreateGraphics(Color.White)
            g.Renderer.Multithreaded = True

            '' The TextLayout that will hold And render the text:
            Dim tl = g.CreateTextLayout()
            tl.FirstLineIndent = 18
            tl.ParagraphSpacing = 6
            tl.FlowDirection = FlowDirection.VerticalRightToLeft
            tl.TextAlignment = TextAlignment.Justified
            tl.DefaultFormat.Font = Font.FromFile(Path.Combine("Resources", "Fonts", "times.ttf"))
            Dim tf = New TextFormat() With
                {
                    .Font = Font.FromFile(Path.Combine("Resources", "Fonts", "yumin.ttf")),
                    .FontSize = 14
                }
            '' Repeat test text to fill the page
            For i = 0 To 11
                tl.Append(Text, tf)
                tl.AppendLine()
            Next

            '' Layout text in 4 horizontal columns
            '' (The logic/code in this sample Is identical to ArabicText)
            Const NCOLS = 4
            Dim margin = 36.0F
            Dim gap = 18.0F
            Dim colHeight = (pageHeight - margin * 2 - gap * (NCOLS - 1)) / NCOLS
            tl.MaxWidth = pageWidth
            tl.MaxHeight = pageHeight
            tl.MarginLeft = margin
            tl.MarginRight = margin
            tl.MarginTop = margin
            tl.MarginBottom = margin + (colHeight + gap) * (NCOLS - 1)
            '' We can specify arbitrary rectangles for the text to flow around.
            '' In this case, we add 3 areas to draw some images:
            tl.ObjectRects = New List(Of ObjectRect)() From
            {
                New ObjectRect(pageWidth - margin - 267, margin, 267, 200),
                New ObjectRect(margin + 100, margin + 60, 133, 100),
                New ObjectRect(margin, pageHeight - margin - 301, 200, 301)
            }
            Using clouds = Util.ImageFromFile(Path.Combine("Resources", "Images", "clouds.jpg"))
                g.DrawImage(clouds, tl.ObjectRects(0).ToRectangleF(), Nothing, ia)
            End Using
            Using firth = Util.ImageFromFile(Path.Combine("Resources", "Images", "firth.jpg"))
                g.DrawImage(firth, tl.ObjectRects(1).ToRectangleF(), Nothing, ia)
            End Using
            Using lavender = Util.ImageFromFile(Path.Combine("Resources", "Images", "lavender.jpg"))
                g.DrawImage(lavender, tl.ObjectRects(2).ToRectangleF(), Nothing, ia)
            End Using

            '' THE call: it calculates the glyphs needed To draw the text, And lays it out:
            tl.PerformLayout(True)

            For col = 0 To NCOLS - 1
                Dim nextcol = If(col < NCOLS - 1, col + 1, 0)
                '' TextSplitOptions tell TextLayout.Split() how to layout the remaining text.
                '' In this case we advance from column to column by updating top And bottom margins:
                Dim tso = New TextSplitOptions(tl) With
                {
                    .RestMarginTop = margin + (colHeight + gap) * nextcol,
                    .RestMarginBottom = margin + (colHeight + gap) * (NCOLS - 1 - nextcol)
                }
                Dim rest As TextLayout = Nothing
                Dim split = tl.Split(tso, rest)
                g.DrawTextLayout(tl, PointF.Empty)
                If (split <> SplitResult.Split) Then
                    Exit For
                End If
                tl = rest
            Next

            '' Draw border around the whole image
            g.DrawRectangle(New RectangleF(0, 0, bmp.Width, bmp.Height), Color.DarkSlateBlue, 4)
        End Using
        Return bmp
    End Function
End Class