ArabicText.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

'' このサンプルは、GcBitmap にアラビア語のテキストを描画する方法を示しています。
Public Class ArabicText
    Function GenerateImage(
        ByVal pixelSize As Size,
        ByVal dpi As Single,
        ByVal opaque As Boolean,
        Optional ByVal sampleParams As String() = Nothing) As GcBitmap

        Dim Text = "العربية أكبر لغات المجموعة السامية من حيث عدد المتحدثين، وإحدى أكثر اللغات انتشارًا في العالم، يتحدثها أكثر من 422 مليون نسمة،1 ويتوزع متحدثوها في المنطقة المعروفة باسم الوطن العربي، بالإضافة إلى العديد من المناطق الأخرى المجاورة كالأحواز وتركيا وتشاد ومالي والسنغالوارتيرياوللغة العربية أهمية قصوى لدى أتباع الديانة الإسلامية، فهي لغة مصدري التشريع الأساسيين في الإسلام: القرآن، والأحاديث النبوية المروية عن النبي محمد، ولا تتم الصلاة في الإسلام (وعبادات أخرى) إلا بإتقان بعض من كلمات هذه اللغة. والعربية هي أيضًا لغة طقسية رئيسية لدى عدد من الكنائس المسيحية في العالم العربي، كما كتبت بها الكثير من أهم الأعمال الدينية والفكرية اليهودية في العصور الوسطى. وأثّر انتشار الإسلام، وتأسيسه دولًا، أرتفعت مكانة اللغة العربية، وأصبحت لغة السياسة والعلم والأدب لقرون طويلة في الأراضي التي حكمها المسلمون، وأثرت العربية، تأثيرًا مباشرًا أو غير مباشر على كثير من اللغات الأخرى في العالم الإسلامي، كالتركية والفارسية والأرديةوالالبانية واللغات الأفريقية الاخرى واللغات الأوروبية مثل الروسية والإنجليزية والفرنسية والأسبانية والايطالية والألمانية.كما انها تدرس بشكل رسمى او غير رسمى في الدول الاسلامية والدول الأفريقية المحادية للوطن العربى."
        Dim ia = New ImageAlign(ImageAlignHorz.Left, ImageAlignVert.Top, True, True, False, False, False)

        Dim bmp = New GcBitmap(pixelSize.Width, pixelSize.Height, True, dpi, dpi)
        Using g = bmp.CreateGraphics(Color.White)
            g.Renderer.Multithreaded = True

            Dim tl = g.CreateTextLayout()
            tl.FirstLineIndent = 18
            tl.ParagraphSpacing = 6
            tl.TextAlignment = TextAlignment.Justified
            tl.RightToLeft = True
            Dim fnt As GCTEXT.Font
            Dim fpath = Path.Combine("Resources", "Fonts", "times.ttf")
            If File.Exists(fpath) Then
                fnt = GCTEXT.Font.FromFile(fpath)
            Else
                fnt = FontCollection.SystemFonts.FindFamilyName("Times New Roman")
            End If
            Dim tf = New TextFormat() With
                {
                    .Font = fnt,
                    .FontSize = 14
                }

            '' 数列分を埋めるためにテストテキストを繰り返し追加します。
            For i = 0 To 3
                tl.Append(Text, tf)
                tl.AppendLine()
            Next

            '' テキストを3列のレイアウトに配置します。
            '' (このサンプルのロジックおよびコードは JapaneseColumns と同様です。)
            Const NCOLS = 3
            Dim margin = 48.0F
            Dim gap = 24.0F
            Dim colWid = (bmp.Width - margin * 2 - gap * (NCOLS - 1)) / NCOLS
            tl.MaxWidth = bmp.Width
            tl.MaxHeight = bmp.Height
            tl.MarginTop = margin
            tl.MarginBottom = margin
            tl.MarginRight = margin
            tl.MarginLeft = margin + (colWid + gap) * (NCOLS - 1)
            '' テキストが回り込むための任意の矩形領域を指定できます。
            '' ここでは、いくつかの画像を描画するために3つの領域を追加します。
            Dim rect1 = New ObjectRect(bmp.Width - margin - 315, margin, 320, 320)
            Dim rect2 = New ObjectRect(margin + 133, margin + 80, 177, 133)
            Dim rect3 = New ObjectRect(margin, bmp.Height - margin - 400, 400, 385)
            tl.ObjectRects = New List(Of ObjectRect)() From {rect1, rect2, rect3}

            '' 重要な呼び出し:テキストの描画に必要なグリフを計算し、レイアウトを実行します。
            tl.PerformLayout(True)

            For col = 0 To NCOLS - 1
                Dim nextcol = If(col < NCOLS - 1, col + 1, 0)
                '' TextSplitOptions は、残りのテキストをどのように配置するかを TextLayout.Split() に指示します。
                '' ここでは、左右の余白を更新することで列から列へと進みます。
                Dim tso = New TextSplitOptions(tl) With
                    {
                        .RestMarginRight = margin + (colWid + gap) * nextcol,
                        .RestMarginLeft = margin + (colWid + 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

            rect1.Height -= 5
            rect2.Left += 10
            rect3.Width -= 10

            Using img = Util.ImageFromFile(Path.Combine("Resources", "Images", "reds.jpg"))
                g.DrawImage(img, rect1.ToRectangleF(), Nothing, ia)
            End Using
            Using img = Util.ImageFromFile(Path.Combine("Resources", "Images", "firth.jpg"))
                g.DrawImage(img, rect2.ToRectangleF(), Nothing, ia)
            End Using
            Using img = Util.ImageFromFile(Path.Combine("Resources", "Images", "purples.jpg"))
                g.DrawImage(img, rect3.ToRectangleF(), Nothing, ia)
            End Using

            '' 画像全体の周囲に境界線を描画します。
            g.DrawRectangle(New RectangleF(0, 0, bmp.Width, bmp.Height), Color.DarkSlateBlue, 4)
        End Using
        Return bmp
    End Function
End Class