TrueTypeHinting.cs
//
// This code is part of GrapeCity Documents for Imaging samples.
// Copyright (c) GrapeCity, Inc. All rights reserved.
//
using System;
using System.IO;
using System.Drawing;
using GrapeCity.Documents.Imaging;
using GrapeCity.Documents.Text;
using GrapeCity.Documents.Drawing;

namespace GcImagingWeb.Samples
{
    // This sample demonstrates how to use TrueType font hinting instructions.
    //
    // Many TrueType fonts include low-level hinting instructions.
    // The original purpose of introducing hinting instructions was 
    // to improve the look of glyphs when the font size is comparable
    // to the device resolution. But such instructions are now also used
    // (especially in CJK fonts) to reuse some glyph parts in different
    // glyphs regardless of the font size.
    // GcGraphics supports hinting instructions. To enable it, set
    // TextFormat.EnableFontHinting property to true when rendering text.
    // 
    // This sample renders a Latin text in a small size with hinting off and on,
    // and then renders a CJK text also with hinting off and on.
    public class TrueTypeHinting
    {
        public GcBitmap GenerateImage(Size pixelSize, float dpi, bool opaque, string[] sampleParams = null)
        {
            var bmp = new GcBitmap(pixelSize.Width, pixelSize.Height, true, dpi, dpi);
            var dy = dpi / 2;
            var ip = new PointF(dpi, dpi);
            using (var g = bmp.CreateGraphics(Color.White))
            {
                // Turning anti-aliasing off makes the hinting effect on small text more obvious:
                g.Renderer.Aliased = true;

                var sOff = "Hinting OFF: ";
                var sOn = "Hinting ON: ";

                // Draw a Latin string with hinting instructions off and on:
                var sLat = "The quick brown fox jumps over the lazy dog.";

                var tfLat = new TextFormat()
                {
                    Font = Font.FromFile(Path.Combine("Resources", "Fonts", "arial.ttf")),
                    FontSize = 12,
                    FontName = "Arial",
                    EnableFontHinting = false
                };
                g.DrawString(sOff + sLat, tfLat, ip);
                ip.Y += dy;

                tfLat.FontSize = 10;
                g.DrawString(sOff + sLat, tfLat, ip);
                ip.Y += dy * 2;

                tfLat.EnableFontHinting = true;
                tfLat.FontSize = 12;
                g.DrawString(sOn + sLat, tfLat, ip);
                ip.Y += dy;

                tfLat.FontSize = 10;
                g.DrawString(sOn + sLat, tfLat, ip);
                ip.Y += dy * 2;

                // Draw a CJK string with hinting instructions off and on:
                // "Best year in spring, best day in morning":
                string sCJK = @"一年之计在于春,一日之计在于晨";

                // For CJK text, we can turn anti-aliasing on as the effect of
                // hinting is obvious in the characters' form itself:
                g.Renderer.Aliased = false;

                var tfCJK = new TextFormat()
                {
                    Font = Font.FromFile(Path.Combine("Resources", "Fonts", "kaiu.ttf")),
                    FontSize = 30,
                    EnableFontHinting = false
                };
                g.DrawString(sOff + "\n" + sCJK, tfCJK, ip);
                ip.Y += dy * 3;

                tfCJK.EnableFontHinting = true;
                g.DrawString(sOn + "\n" + sCJK, tfCJK, ip);
            }
            // Done:
            return bmp;
        }
    }
}