//
// This code is part of Document Solutions for Imaging demos.
// Copyright (c) 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
{
// This example demonstrates the differences in fidelity between texts
// rendered on bitmaps using the different DsImaging libraries:
// - DsImaging (cross-platform, package GrapeCity.Documents.Imaging);
// - DsImaging.Skia (cross-platform, package GrapeCity.Documents.Imaging.Skia);
// - DsImaging.Windows (Windows only, package GrapeCity.Documents.Imaging.Windows).
// Note that the results are rather noticeable here because the text is rendered
// using a very small font, and then significantly enlarged when dawn on the
// resulting image generated by the sample. In most real-life applications
// the differences are very subtle if noticeable at all.
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", "tahoma.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;
}
}
}