Gradients.cs
// 
// このコードは、DioDocs for PDF のサンプルの一部として提供されています。
// Copyright (c) GrapeCity inc. All rights reserved.
// 
using System;
using System.IO;
using System.Drawing;
using GrapeCity.Documents.Pdf;
using GrapeCity.Documents.Text;
using GrapeCity.Documents.Drawing;

namespace GcPdfWeb.Samples.Basics
{
    // LinearGradientBrush と RadialGradientBrush を使用して
    // グラデーション塗りを作成する方法を示します。
    //[SampleMessage("GcGraphics でのグラデーションのレンダリングはまだサポートされていません。")]
    public class Gradients
    {
        public void CreatePDF(Stream stream)
        {
            var doc = new GcPdfDocument();
            var g = doc.NewPage().Graphics;
            var testRectSize = new SizeF(72 * 4, 72);
            var dy = 12;
            // ラベルを描画するテキストレイアウト。
            var tl = g.CreateTextLayout();
            tl.DefaultFormat.FontName = "Yu Gothic";
            tl.DefaultFormat.FontSize = 16;
            tl.DefaultFormat.ForeColor = Color.Chartreuse;
            tl.MaxWidth = testRectSize.Width;
            tl.MaxHeight = testRectSize.Height;
            tl.TextAlignment = TextAlignment.Center;
            tl.ParagraphAlignment = ParagraphAlignment.Center;
            // ノート:
            var rc = Common.Util.AddNote("LinearGradientBrush を使用した線形グラデーション:", doc.Pages.Last, new RectangleF(72, 36, 500, 100));
            // テキストの挿入位置。
            PointF ip = new PointF(rc.Left, rc.Bottom + dy);
            // グラデーションが塗りつぶされた矩形を描画するローカルアクション。
            Action<Brush, string> drawSwatch = (b_, txt_) =>
            {
                var rect = new RectangleF(ip, testRectSize);
                // 矩形をグラデーションブラシで塗りつぶします。
                g.FillRectangle(rect, b_);
                // 境界線やテキストを描画します。
                g.DrawRectangle(rect, Color.Magenta);
                tl.Clear();
                tl.Append(txt_);
                tl.MaxHeight = testRectSize.Height;
                tl.MaxWidth = testRectSize.Width;
                tl.PerformLayout(true);
                g.DrawTextLayout(tl, ip);
                ip.Y += rect.Height + dy;
            };
            // 水平グラデーション。
            LinearGradientBrush linearGradBrush = new LinearGradientBrush(Color.Red, Color.Blue);
            drawSwatch(linearGradBrush, $"線形グラデーション\r\n {linearGradBrush.StartPoint} から {linearGradBrush.EndPoint} まで");
            // 垂直グラデーション。
            linearGradBrush = new LinearGradientBrush(Color.Red, new PointF(0, 0), Color.Green, new PointF(0, 1));
            drawSwatch(linearGradBrush, $"線形グラデーション\r\n {linearGradBrush.StartPoint} から{linearGradBrush.EndPoint} まで");
            // 対角線グラデーション(対角線をよりよく表示するためにスウォッチの高さを上げます)。
            testRectSize.Height *= 2;
            linearGradBrush = new LinearGradientBrush(Color.Red, new PointF(0, 0), Color.Teal, new PointF(1, 1));
            drawSwatch(linearGradBrush, $"線形グラデーション\r\n {linearGradBrush.StartPoint} から{linearGradBrush.EndPoint} まで");
            // 放射グラデーション。
            rc = Common.Util.AddNote("RadialGradientBrush を使用した放射グラデーション:", doc.Pages.Last, new RectangleF(ip, new SizeF(500, 100)));
            ip.Y = rc.Bottom + dy;
            // 中央に中心点。
            RadialGradientBrush radialGradBrush = new RadialGradientBrush(Color.Orange, Color.Purple);
            drawSwatch(radialGradBrush, $"放射グラデーション\r\n原点 {radialGradBrush.GradientOrigin}");
            // 右下隅に中心点。
            radialGradBrush = new RadialGradientBrush(Color.OrangeRed, Color.DarkBlue, new PointF(1, 1));
            drawSwatch(radialGradBrush, $"放射グラデーション\r\n原点 {radialGradBrush.GradientOrigin}");
            // PDF ドキュメントを保存します。
            doc.Save(stream);
        }
    }
}