ArabicText.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 Arabic text on a GcBitmap.
Public Class ArabicText
    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 = "العربية أكبر لغات المجموعة السامية من حيث عدد المتحدثين، وإحدى أكثر اللغات انتشارًا في العالم، يتحدثها أكثر من 422 مليون نسمة،1 ويتوزع متحدثوها في المنطقة المعروفة باسم الوطن العربي، بالإضافة إلى العديد من المناطق الأخرى المجاورة كالأحواز وتركيا وتشاد ومالي والسنغالوارتيرياوللغة العربية أهمية قصوى لدى أتباع الديانة الإسلامية، فهي لغة مصدري التشريع الأساسيين في الإسلام: القرآن، والأحاديث النبوية المروية عن النبي محمد، ولا تتم الصلاة في الإسلام (وعبادات أخرى) إلا بإتقان بعض من كلمات هذه اللغة. والعربية هي أيضًا لغة طقسية رئيسية لدى عدد من الكنائس المسيحية في العالم العربي، كما كتبت بها الكثير من أهم الأعمال الدينية والفكرية اليهودية في العصور الوسطى. وأثّر انتشار الإسلام، وتأسيسه دولًا، أرتفعت مكانة اللغة العربية، وأصبحت لغة السياسة والعلم والأدب لقرون طويلة في الأراضي التي حكمها المسلمون، وأثرت العربية، تأثيرًا مباشرًا أو غير مباشر على كثير من اللغات الأخرى في العالم الإسلامي، كالتركية والفارسية والأرديةوالالبانية واللغات الأفريقية الاخرى واللغات الأوروبية مثل الروسية والإنجليزية والفرنسية والأسبانية والايطالية والألمانية.كما انها تدرس بشكل رسمى او غير رسمى في الدول الاسلامية والدول الأفريقية المحادية للوطن العربى."
        Dim ia = New ImageAlign(ImageAlignHorz.Left, ImageAlignVert.Top, True, True, False, False, False)

        Dim bmp = New GcBitmap(pixelWidth, pixelHeight, True, dpiX, dpiY)
        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 tf = New TextFormat() With
                {
                    .Font = Font.FromFile(Path.Combine("Resources", "Fonts", "times.ttf")),
                    .FontSize = 14
                }

            '' Repeat test text to fill a few columns
            For i = 0 To 3
                tl.Append(Text, tf)
                tl.AppendLine()
            Next

            '' Layout text in 3 columns
            '' (The logic/code in this sample Is identical to 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)
            '' We can specify arbitrary rectangles for the text to flow around.
            '' In this case, we add 3 areas to draw some images:
            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}

            '' 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
                    {
                        .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

            '' 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