TateChuYoko.cs
// 
// このコードは、DioDocs for Imaging のサンプルの一部として提供されています。
// © MESCIUS inc. All rights reserved.
// 
using System;
using System.IO;
using System.Drawing;
using System.Collections.Generic;
using System.Linq;
using GrapeCity.Documents.Drawing;
using GrapeCity.Documents.Text;
using GrapeCity.Documents.Imaging;
using GCTEXT = GrapeCity.Documents.Text;
using GCDRAW = GrapeCity.Documents.Drawing;

namespace DsImagingWeb.Demos
{
    // このサンプルは、縦書きテキストブロック内の短いラテン文字または数字を縦書きでレンダリングする方法を示しています。
    // これは、中国語、日本語、韓国語の縦書きテキストで使用されます。CSSでは、これは日本語の「縦中横」と呼ばれます。
    // GcGraphicsでこれを実現するには、TextFormat.UprightInVerticalTextプロパティを設定する必要があります。
    // このサンプルに示すように、TextLayoutとTextFormatの他のいくつかのプロパティを使用して、動作を微調整できます。
    public class TateChuYoko
    {
        public GcBitmap GenerateImage(Size pixelSize, float dpi, bool opaque, string[] sampleParams = null)
        {
            var bmp = new GcBitmap(pixelSize.Width, pixelSize.Height, opaque, dpi, dpi);
            using (var g = bmp.CreateGraphics(Color.White))
            {

                var fntJp = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "NotoSansJP-Regular.ttf"));
                var fntLat = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "NotoSans-Condensed.ttf"));
                var hiliteFore = Color.DarkSlateBlue;
                var hiliteBack = Color.FromArgb(unchecked((int)0xffffff99));

                var tl = g.CreateTextLayout();

                // テキストの流れ(縦書き)とその他のレイアウトプロパティを設定します。
                tl.FlowDirection = FlowDirection.VerticalRightToLeft;
                tl.MaxWidth = g.Width;
                tl.MaxHeight = g.Height;
                tl.MarginAll = g.Resolution;
                tl.ParagraphSpacing = 12;
                tl.LineSpacingScaleFactor = 1.4f;

                // 正立テキスト(短いラテン文字の単語や数字)用のテキスト形式
                // (GlyphWidths は対応するフォント機能を有効にしますが、フォントにその機能が含まれている場合にのみ効果があります)
                var fUpright = new TextFormat()
                {
                    Font = fntLat,
                    FontSize = 14,
                    UprightInVerticalText = true,
                    GlyphWidths = GlyphWidths.QuarterWidths,
                    TextRunAsCluster = true,
                };
                // 縦書きの日本語および横向きのラテン文字テキスト用のテキスト形式
                var fVertical = new TextFormat(fUpright)
                {
                    Font = fntJp,
                    UprightInVerticalText = false,
                    GlyphWidths = GlyphWidths.Default,
                    TextRunAsCluster = false,
                };

                // 横向きテキストのランが垂直方向の行間に影響しないように設定します。
                fVertical.UseVerticalLineGapForSideways = true;
                // 以下のコメントアウトされた部分は、上記の UseVerticalLineGapForSideways プロパティの設定と実質的に同じ動作をします。
                /*
                var scale = fVertical.FontSize * tl.FontScaleFactor / fntJp.UnitsPerEm;
                if (!fVertical.FontSizeInGraphicUnits)
                    scale *= tl.Resolution / 72f;
                fVertical.LineGap = fntJp.VerticalLineGap * scale;
                */

                // 強調表示されたヘッダー用の2つの追加テキスト形式。
                var fUpHdr = new TextFormat(fUpright)
                {
                    ForeColor = hiliteFore,
                    BackColor = hiliteBack
                };
                var fVertHdr = new TextFormat(fVertical)
                {
                    ForeColor = hiliteFore,
                    BackColor = hiliteBack
                };

                tl.Append("PDF", fUpright);
                tl.Append("ファイルをコードから", fVertical);
                tl.Append("API", fUpright);
                tl.Append("を利用することで操作できます。クロスプラットフォーム環境で動作するアプリケーションの開発を支援する", fVertical);
                tl.Append("API", fUpright);
                tl.Append("ライブラリです。", fVertical);

                // 残りのテキストには小さいフォントサイズを使用します。
                fUpright.FontSize -= 2;
                fVertical.FontSize -= 2;

                // 項目 1
                tl.AppendParagraphBreak();
                tl.Append("PDF", fUpHdr);
                tl.Append("用の包括的な", fVertHdr);
                tl.Append("API", fUpHdr);

                tl.AppendSoftBreak();
                tl.Append("PDF", fUpright);
                tl.Append("バージョン「", fVertical);
                tl.Append("1.7", fUpright);
                tl.Append("」に準拠した", fVertical);
                tl.Append("API", fUpright);
                tl.Append("を提供し、レイアウトや機能を損なうことなく、豊富な機能を備えた", fVertical);
                tl.Append("PDF", fUpright);
                tl.Append("文書を生成、編集、保存できます。", fVertical);

                // 項目 2
                tl.AppendParagraphBreak();
                tl.Append("完全なテキスト描画", fVertHdr);

                tl.AppendSoftBreak();
                tl.Append("PDF", fUpright);
                tl.Append("文書にテキストの描画情報が保持されます。テキストと段落の書式、特殊文字、複数の言語、縦書き、テキスト角度などが保持さるので、完全な形でテキスト描画を再現できます。", fVertical);

                // 項目 3
                tl.AppendParagraphBreak();
                tl.Append(".NET Standard 2.0 準拠", fVertHdr);

                tl.AppendSoftBreak();
                tl.Append(".NET Core、.NET Framework、Xamarinで動作するアプリケーションを開発できます。Windows、macOS、Linuxなどクロスプラットフォーム環境で動作可能です。", fVertical);

                // 項目 4
                tl.AppendParagraphBreak();
                tl.Append("100", fUpHdr);
                tl.Append("を超える", fVertHdr);
                tl.Append("PDF", fUpHdr);
                tl.Append("操作機能", fVertHdr);

                tl.AppendSoftBreak();
                tl.Append("ページの追加や削除、ページサイズ、向きの変更だけでなく、ファイルの圧縮、", fVertical);
                tl.Append("Web", fUpright);
                tl.Append("に最適化した", fVertical);
                tl.Append("PDF", fUpright);
                tl.Append("の生成など高度な機能も", fVertical);
                tl.Append("API", fUpright);
                tl.Append("操作で実現します。また、署名からセキュリティ機能まで様々な機能を含んだ", fVertical);
                tl.Append("PDF", fUpright);
                tl.Append("フォームを生成可能です。", fVertical);

                // 項目 5
                tl.AppendParagraphBreak();
                tl.Append("高速、軽量アーキテクチャ", fVertHdr);

                tl.AppendSoftBreak();
                tl.Append("軽量", fVertical);
                tl.Append("API", fUpright);
                tl.Append("アーキテクチャでメモリと時間を節約できます。", fVertical);
                tl.AppendSoftBreak();
                tl.Append("また、他の生成用ツールに依存せずドキュメントを生成可能です。", fVertical);

                // 項目 6
                tl.AppendParagraphBreak();
                tl.Append("クラウドアプリケーション展開", fVertHdr);
                tl.Append("", fUpHdr);

                tl.AppendSoftBreak();
                tl.Append("Azure、AWSなどのサービスに配置するクラウドアプリケーションの開発で利用可能です。仮想マシン、コンテナ、サーバーレスなどの方法で配置できます。", fVertical);

                tl.PerformLayout(true);
                g.DrawTextLayout(tl, PointF.Empty);
            }

            return bmp;
        }
    }
}