GcLibsComparison.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 GrapeCity.Documents.Imaging.Skia;
using GrapeCity.Documents.Imaging.Windows;
using GCTEXT = GrapeCity.Documents.Text;
using GCDRAW = GrapeCity.Documents.Drawing;

namespace DsImagingWeb.Demos
{
    // このサンプルは、異なる DsImaging ライブラリを使用して
    // ビットマップ上に描画されたテキストの忠実度の違いを示します。
    // - DsImaging(クロスプラットフォーム、パッケージ: DS.Documents.Imaging)
    // - DsImaging.Skia(クロスプラットフォーム、パッケージ: DS.Documents.Imaging.Skia)
    // - DsImaging.Windows(Windows 専用、パッケージ: DS.Documents.Imaging.Windows)
    //
    // 本サンプルでは、非常に小さいフォントでテキストを描画した後、
    // サンプルによって生成された結果画像上で大幅に拡大しているため、
    // 差異が比較的明確に確認できます。
    // 実際の業務アプリケーションにおいては、これらの差異が
    // 問題となるケースは少なく、視認上ほとんど認識されない場合が大半です。
    public class GcLibsComparison
    {
        public GcBitmap GenerateImage(Size pixelSize, float dpi, bool opaque, string[] sampleParams = null)
        {
            const string text = "Skia is an open source 2D graphics library which provides common APIs that work across a variety of hardware and software platforms.";
            int q = 4;
            int width = pixelSize.Width / q;
            int height = pixelSize.Height / (q * 3);
            int margin = 12;
            var tf = new TextFormat
            {
                Font = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "FreeSans.ttf")),
                FontSize = 10
            };
            string msg = $"Text with font size {tf.FontSize} rendered using {{0}} and enlarged x{q}:";

            using var gcBmp = new GcBitmap(width, height, false);
            using (var g = gcBmp.CreateGraphics(Color.Transparent))
            {
                var tl = g.CreateTextLayout();
                tl.MaxWidth = width;
                tl.MarginAll = margin;
                tl.Append(text, tf);
                g.DrawTextLayout(tl, PointF.Empty);
            }

            using var gcSkiaBmp = new GcSkiaBitmap(width, height, false);
            using (var g = gcSkiaBmp.CreateGraphics(Color.Transparent))
            {
                var tl = g.CreateTextLayout();
                tl.MaxWidth = width;
                tl.MarginAll = margin;
                tl.Append(text, tf);
                g.DrawTextLayout(tl, PointF.Empty);
            }

            GcWicBitmap gcWicBmp = null;
            if (GcWicBitmap.IsSupported)
            {
                gcWicBmp = new GcWicBitmap(width, height, false);
                using (var g = gcWicBmp.CreateGraphics(Color.Transparent))
                {
                    var tl = g.CreateTextLayout();
                    tl.MaxWidth = width;
                    tl.MarginAll = margin;
                    tl.Append(text, tf);
                    g.DrawTextLayout(tl, PointF.Empty);
                }
            }

            var bmp = new GcBitmap(pixelSize.Width, pixelSize.Height, opaque);
            using (var g = bmp.CreateGraphics(Color.White))
            {
                g.Renderer.InterpolationMode = InterpolationMode.NearestNeighbor;
                var fs = 16;
                var dy = pixelSize.Height / 3;
                tf.FontSize = fs;
                g.DrawString(string.Format(msg, "GcBitmapGraphics (cross-platform)"), tf, new PointF(margin / 3, margin / 3));
                var rc = new RectangleF(0, fs * 2, width * q, height * q - fs * 2);
                rc.Inflate(-margin, -margin);
                g.DrawImage(gcBmp, rc, null, ImageAlign.StretchImage);
                g.DrawRoundRect(rc, margin, Color.MediumVioletRed);

                g.DrawString(string.Format(msg, "GcSkiaGraphics (cross-platform)"), tf, new PointF(margin / 3, dy + margin / 3));
                rc = new RectangleF(0, fs * 2 + dy, width * q, height * q - fs * 2);
                rc.Inflate(-margin, -margin);
                g.DrawImage(gcSkiaBmp, rc, null, ImageAlign.StretchImage);
                g.DrawRoundRect(rc, margin, Color.MediumVioletRed);

                g.DrawString(string.Format(msg, "GcWicBitmapGraphics (Windows-only)"), tf, new PointF(margin / 3, dy * 2 + margin / 3));
                rc = new RectangleF(0, fs * 2 + dy * 2, width * q, height * q - fs * 2);
                rc.Inflate(-margin, -margin);
                if (gcWicBmp != null)
                {
                    g.DrawImage(gcWicBmp, rc, null, ImageAlign.StretchImage);
                }
                else
                {
                    var tl = g.CreateTextLayout();
                    tl.MaxWidth = rc.Width;
                    tl.MarginAll = margin;
                    tl.DefaultFormat.Font = tf.Font;
                    tl.DefaultFormat.FontSize = 16;
                    tl.DefaultFormat.ForeColor = Color.OrangeRed;
                    tl.AppendLine(
                        "Looks like this demo is not running on a Windows system, so WIC (GcWicBitmap, GcWicBitmapGraphics) " +
                        "is not supported. To see how text rendered using GcWicBitmapGraphics looks, download this demo project " +
                        "and run it on a Windows system.");
                    g.DrawTextLayout(tl, rc.Location);
                }
                g.DrawRoundRect(rc, margin, Color.MediumVioletRed);
            }
            if (gcWicBmp != null)
                gcWicBmp.Dispose();

            return bmp;
        }
    }
}