SoftMask1.vb
'' 
'' このコードは、DioDocs for PDF のサンプルの一部として提供されています。
'' Copyright (c) GrapeCity 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

'' このサンプルは、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(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 = 0F To 255 Step 255.0F / 8
            sMask = SoftMask.Create(doc, rDoc)
            smGraphics = sMask.FormXObject.Graphics
            smGraphics.DrawString($"■テキストの透明度(アルファ値) = {CType(alpha, Integer)}",
                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(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