SurrogatesPort.vb
'' 
'' このコードは、DioDocs for PDF のサンプルの一部として提供されています。
'' © MESCIUS inc. All rights reserved.
'' 
Imports System.IO
Imports System.Drawing
Imports GrapeCity.Documents.Pdf
Imports GrapeCity.Documents.Text
Imports GCTEXT = GrapeCity.Documents.Text
Imports GCDRAW = GrapeCity.Documents.Drawing

'' このサンプルは、Surrogates サンプルと同様に、サロゲート・ペアを含む
'' さまざまな Unicode 文字を描画します。
'' しかし、そのサンプルとは異なり、システム提供のフォールバックには依存しません。
'' 代わりに、このサンプルでは、フォールバックフォントの参照をプログラム自身の
'' フォントコレクションに意図的に制限し、独自のフォールバックフォントセットを
'' 提供しています。
'' これにより、コードのプラットフォームとシステムは独立しているため、Windows、
'' Linux、または Mac でまったく同じ結果が得られます。
Public Class SurrogatesPort
    Function CreatePDF(ByVal stream As Stream) As Integer
        Dim doc = New GcPdfDocument()
        Dim page = doc.NewPage()
        Dim g = page.Graphics

        '' Surrogates サンプルのように、標準フォント(描画するグリフが
        '' ほとんどない)を指定し、FontCollection が提供するフォントフォール
        '' バックサポートに依存します。
        Dim font = Util.getFont()

        '' キャプションなどの書式を設定します。
        Dim tf = New TextFormat() With {.Font = font, .FontSize = 12}
        Dim tf1 = New TextFormat(tf) With {.FontSize = 14}
        Dim tfs = New TextFormat(tf) With {.FontSize = 6}

        '' 使用するフォントコレクションを作成します。
        Dim fc = New FontCollection()
        '' 使用するフォールバックフォントを追加します。
        '' 順序は注意が必要です。最初に該当したものから適用されます。
        fc.AppendFallbackFonts(
            GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "arialuni.ttf")),
            GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "l_10646.ttf")),
            GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "seguiemj.ttf")),
            GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "seguisym.ttf")),
            GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "simsun.ttc")),
            GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "times.ttf")),
            GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "YuGothR.ttc"))
        )

        '' デフォルトのフォント検索を制限するのは TextLayout で行われるため、
        '' Surrogates サンプルとは異なり、ここでは DrawString を使用できません。
        '' TextLayout と DrawTextLayout を直接使用する必要があります。
        '' - 使用するフォントコレクションを指定します。
        '' - 既定のフォント/フォールバックの検索を指定されたコレクションのみに制限します。
        '' - テキストを描画するためのほかのプロパティを設定します。
        Dim tl = New TextLayout(72) With {
            .FontCollection = fc,
            .RestrictedFontLookup = True,
            .FontFallbackScope = FontFallbackScope.FontCollectionOnly,
            .MaxWidth = page.Size.Width,
            .MaxHeight = page.Size.Height,
            .MarginLeft = 72,
            .MarginRight = 72,
            .MarginTop = 36,
            .MarginBottom = 36,
            .TextAlignment = TextAlignment.Center
        }

        tl.Append("ユニークな Unicode 文字(システムに依存しない)",
                  New TextFormat(tf) With {.Underline = True, .FontSize = tf.FontSize + 2})
        tl.PerformLayout(True)
        g.DrawTextLayout(tl, PointF.Empty)

        tl.MarginTop = tl.ContentRectangle.Bottom + 20
        tl.Clear()
        tl.TextAlignment = TextAlignment.Leading

        '' 文字列を描画します。
        tl.Append("サロゲートペア文字:" + vbCrLf, tf)
        tl.Append($"{ChrW(&HD867)}{ChrW(&HDEDB)} {ChrW(&HD840)}{ChrW(&HDC0B)} {ChrW(&HD834)}{ChrW(&HDD1E)} {ChrW(&HD834)}{ChrW(&HDD61)} {ChrW(&HD83D)}{ChrW(&HDC04)}{vbCrLf}", tf1)
        tl.Append(vbCrLf, tfs)

        tl.Append("通貨記号:" + vbCrLf, tf)
        tl.Append($"{ChrW(&H24)} {ChrW(&H20A0)} {ChrW(&H20A1)} {ChrW(&H20A2)} {ChrW(&H20A3)} {ChrW(&H20A4)} {ChrW(&H20AC)} {ChrW(&H20B9)} {ChrW(&H20BD)}{vbCrLf}", tf1)
        tl.Append(vbCrLf, tfs)

        tl.Append("数学演算子:" + vbCrLf, tf)
        tl.Append($"{ChrW(&H221A)} {ChrW(&H222B)} {ChrW(&H2211)} {ChrW(&H2210)} {ChrW(&H2264)} {ChrW(&H2265)} {ChrW(&H2202)} {ChrW(&H2208)}{vbCrLf}", tf1)
        tl.Append(vbCrLf, tfs)

        tl.Append("CJK 統合漢字A:" + vbCrLf, tf)
        tl.Append($"{ChrW(&H3400)} {ChrW(&H3401)} {ChrW(&H3402)} {ChrW(&H3403)} {ChrW(&H3404)} {ChrW(&H3405)} {ChrW(&H3406)} {ChrW(&H3407)}{vbCrLf}", tf1)
        tl.Append(vbCrLf, tfs)

        tl.Append("和暦合字:" + vbCrLf, tf)
        tl.Append($"{ChrW(&H337E)} {ChrW(&H337D)} {ChrW(&H337C)} {ChrW(&H337B)} {ChrW(&H32FF)}", tf1)
        tl.Append(vbCrLf, tfs)

        tl.Append("文字様記号:" + vbCrLf, tf)
        tl.Append($"{ChrW(&H2110)} {ChrW(&H2111)} {ChrW(&H2112)} {ChrW(&H2113)} {ChrW(&H2114)} {ChrW(&H2115)} {ChrW(&H211B)} {ChrW(&H211C)}{vbCrLf}", tf1)
        tl.Append(vbCrLf, tfs)

        tl.Append("私用領域:" + vbCrLf, tf)
        tl.Append($"{ChrW(&HE000)} {ChrW(&HE001)} {ChrW(&HE010)} {ChrW(&HE011)} {ChrW(&HE012)} {ChrW(&HE013)} {ChrW(&HE014)} {ChrW(&HE015)}{vbCrLf}", tf1)
        tl.Append(vbCrLf, tfs)

        tl.Append("矢印:" + vbCrLf, tf)
        tl.Append($"{ChrW(&H2190)} {ChrW(&H2191)} {ChrW(&H2192)} {ChrW(&H2193)} {ChrW(&H21B0)} {ChrW(&H21E6)} {ChrW(&H21CB)} {ChrW(&H21A9)}{vbCrLf}", tf1)
        tl.Append(vbCrLf, tfs)

        tl.Append("装飾記号:" + vbCrLf, tf)
        tl.Append($"{ChrW(&H2714)} {ChrW(&H2717)} {ChrW(&H275B)} {ChrW(&H275C)} {ChrW(&H2706)} {ChrW(&H2707)} {ChrW(&H2708)} {ChrW(&H2709)}{vbCrLf}", tf1)
        tl.Append(vbCrLf, tfs)

        tl.Append("点字パターン:" + vbCrLf, tf)
        tl.Append($"{ChrW(&H2830)} {ChrW(&H2831)} {ChrW(&H2832)} {ChrW(&H2833)} {ChrW(&H2834)} {ChrW(&H2835)} {ChrW(&H2836)} {ChrW(&H2837)}{vbCrLf}", tf1)
        tl.Append(vbCrLf, tfs)

        tl.Append("幾何学的形状:" + vbCrLf, tf)
        tl.Append($"{ChrW(&H25D0)} {ChrW(&H25D1)} {ChrW(&H25D2)} {ChrW(&H25D3)} {ChrW(&H25A4)} {ChrW(&H25F0)} {ChrW(&H25BC)} {ChrW(&H25CE)}{vbCrLf}", tf1)
        tl.Append(vbCrLf, tfs)

        tl.Append("ラテン語拡張A:" + vbCrLf, tf)
        tl.Append($"{ChrW(&H100)} {ChrW(&H101)} {ChrW(&H102)} {ChrW(&H103)} {ChrW(&H104)} {ChrW(&H105)} {ChrW(&H106)} {ChrW(&H107)}{vbCrLf}", tf1)
        tl.Append(vbCrLf, tfs)

        tl.Append("絵文字、その他:" + vbCrLf, tf)
        tl.Append($"{ChrW(&H2600)} {ChrW(&H2601)} {ChrW(&H2602)} {ChrW(&H2603)} {ChrW(&H2604)} {ChrW(&H2605)} {ChrW(&H2606)} " +
                  $"{ChrW(&H2607)} {ChrW(&H2608)} {ChrW(&H2609)} {ChrW(&H2614)} {ChrW(&H2615)} {ChrW(&H26F0)}{vbCrLf}", tf1)
        tl.Append(vbCrLf, tfs)

        tl.PerformLayout(True)
        g.DrawTextLayout(tl, PointF.Empty)
        ''
        '' PDF ドキュメントを保存します。
        doc.Save(stream)
        Return doc.Pages.Count
    End Function
End Class