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

'' このサンプルでは、​​GcGraphics.PushClip/PopClip メソッドを使用してクリッピングを指定する方法を示します。
Public Class PushClip
    Function GenerateImage(
        ByVal pixelSize As Size,
        ByVal dpi As Single,
        ByVal opaque As Boolean,
        Optional ByVal sampleParams As String() = Nothing) As GcBitmap

        Dim backColor = Color.FromArgb(&HFF0066CC)
        Dim foreColor = Color.FromArgb(&HFFFFCC00)
        Dim bmp = New GcBitmap(pixelSize.Width, pixelSize.Height, True, dpi, dpi)
        Dim cw = 400, ch = 300, pad = 10, bord = 4
        Dim clipRc = New RectangleF(pixelSize.Width - cw - pad, pad, cw, ch)
        Using g = bmp.CreateGraphics(backColor)
            '' 2つのネストされた長方形からなるパスを作成します。
            '' 外側の長方形はビットマップ全体、内側の長方形はテキストボックスです。
            '' 次に、このパスを使用してクリップ領域を作成し、
            '' テキストボックスを除くビットマップ全体を覆う画像を描画します。
            Using gpath = g.CreatePath()
                gpath.BeginFigure(PointF.Empty)
                gpath.AddLine(New PointF(pixelSize.Width, 0))
                gpath.AddLine(New PointF(pixelSize.Width, pixelSize.Height))
                gpath.AddLine(New PointF(0, pixelSize.Height))
                gpath.EndFigure(FigureEnd.Closed)
                gpath.BeginFigure(New PointF(clipRc.Left, clipRc.Top))
                gpath.AddLine(New PointF(clipRc.Right, clipRc.Top))
                gpath.AddLine(New PointF(clipRc.Right, clipRc.Bottom))
                gpath.AddLine(New PointF(clipRc.Left, clipRc.Bottom))
                gpath.EndFigure(FigureEnd.Closed)
                Using cliprgn = g.CreateClipRegion(gpath)
                    Using img = GCDRAW.Image.FromFile(Path.Combine("Resources", "ImagesBis", "clivia.jpg"))
                        g.PushClip(cliprgn)
                        g.DrawImage(
                            img,
                            New RectangleF(0, 0, pixelSize.Width, pixelSize.Height),
                            Nothing,
                            ImageAlign.StretchImage)
                        g.PopClip(cliprgn)
                    End Using
                End Using
            End Using
            '' テキストボックス内にテキストを描画します。
            '' テキストボックスの範囲でクリッピングを行います。
            '' PushClipのこのオーバーロードは、破棄される時にクリッピングを解除するIDisposableオブジェクトを返します。
            Using (g.PushClip(clipRc))
                g.DrawString(
                    Util.LoremIpsum(),
                    New TextFormat() With
                    {
                        .Font = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "FreeSerif.ttf")),
                        .FontSize = 16,
                        .ForeColor = foreColor
                    },
                    clipRc
                    )
            End Using
            '' 画像全体を囲む境界線を描画します。
            '' これにより、クリップ領域が正常に解除されていることを確認できます。
            g.DrawRectangle(
                New RectangleF(bord / 2, bord / 2, pixelSize.Width - bord, pixelSize.Height - bord),
                New GCDRAW.Pen(foreColor, bord))
        End Using
        '' 画像ファイルを保存します。
        Return bmp
    End Function
End Class