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

'' このサンプルは、GcPdfGraphics.SoftMask を使用して
'' 半透明を描画しクリッピングを指定する方法を示します。
Public Class SoftMask1
    Function CreatePDF(ByVal stream As Stream) As Integer
        Dim doc = New GcPdfDocument()
        Dim page = doc.NewPage()
        Dim g = page.Graphics

        Dim rc = Util.AddNote(
            "GcPdfGraphics でマスクを使用した描画が可能です。" +
            "FormXObject でマスクを作成し、サポートされている任意の描画方法(半透明描画を含む)を使用して" +
            "対象オブジェクトの Graphics を描画します。" +
            "その結果をページに描画する際、ページのSoftMask プロパティに設定するとマスクとして使用できます。" +
            "マスクからのアルファチャンネルが適用され、塗りつぶされた領域はマスクされず、" +
            "透明領域がマスクされます。半透明領域は指定したアルファ値に応じたマスクになります。",
            page)

        Dim rMask = New RectangleF(0, 0, 72 * 5, 72 * 2)
        Dim rDoc = New RectangleF(rc.Left, rc.Bottom + 36, rMask.Width, rMask.Height)

        Dim sMask = SoftMask.Create(doc, rDoc)
        Dim smGraphics = sMask.FormXObject.Graphics
        smGraphics.FillEllipse(rMask, Color.FromArgb(128, Color.Black))
        smGraphics.DrawString("半透明テキスト",
            New TextFormat() With {.Font = StandardFonts.HelveticaBold, .FontSize = 36, .ForeColor = Color.Black},
            New RectangleF(rMask.X, rMask.Y, rMask.Width, rMask.Height),
            TextAlignment.Center, ParagraphAlignment.Center, False)
        Dim rt = rMask
        rt.Inflate(-8, -8)
        '' マスクにはアルファチャンネルのみが重要で、色は関係ありません。
        smGraphics.DrawEllipse(rt, Color.Red)

        g.SoftMask = sMask
        g.DrawImage(GCDRAW.Image.FromFile(Path.Combine("Resources", "Images", "reds.jpg")), rDoc, Nothing, ImageAlign.StretchImage)
        '' メモ:一部の PDF ビューワ(ブラウザ内蔵のビューワなど)では、
        '' 新しいマスクを割り当てる前にマスクをリセットしないと、
        '' マスクの変更が正しく処理されない場合があります。
        g.SoftMask = SoftMaskBase.None

        rDoc.Offset(0, rDoc.Height + 12)
        rDoc.Width = rc.Width
        rDoc.Height = 36
        rMask.Height = rDoc.Height

        For alpha = 16 To 255 Step 32
            sMask = SoftMask.Create(doc, rDoc)
            smGraphics = sMask.FormXObject.Graphics
            smGraphics.DrawString($"■テキストの透明度(アルファ値) = {alpha}",
                New TextFormat() With {.Font = StandardFonts.HelveticaBold, .FontSize = 20, .ForeColor = Color.FromArgb(alpha, Color.Black)},
                New RectangleF(rMask.X, rMask.Y, rMask.Width, rMask.Height),
                TextAlignment.Leading, ParagraphAlignment.Center, False)
            g.SoftMask = sMask
            g.DrawImage(GCDRAW.Image.FromFile(Path.Combine("Resources", "Images", "reds.jpg")), rDoc, Nothing, ImageAlign.StretchImage)
            g.SoftMask = SoftMaskBase.None
            rDoc.Offset(0, rDoc.Height)
        Next

        '' PDF ドキュメントを保存します。
        doc.Save(stream)
        Return doc.Pages.Count
    End Function
End Class