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