// 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.Drawing;
using GrapeCity.Documents.Imaging;
using GrapeCity.Documents.Text;
using GrapeCity.Documents.Html;

namespace GcImagingWeb.Samples
    // This sample shows how to render a hard-coded HTML string.
    // Adding GcHtml to your projects:
    // - Public classes and extension methods that enable rendering HTML
    //   are provided by the GrapeCity.Documents.Html (GcHtml) package.
    // - GcHtml supports Windows, macOS and Linux platforms.
    // Dealing with errors when using GcHtml:
    // - If GcHtml is not doing what you expect (e.g. rendering HTML to PDF
    //   produces an invalid PDF), check the content of the string property
    //   GcHtmlBrowser.ErrorLog after the call to SaveAsPdf returns,
    //   it may explain why the error occurred.
    // GcHtml uses a local copy of a Chromium-based browser.
    // You can either rely on Google Chrome or Microsoft Edge browsers
    // installed in the operating system, or download an instance of
    // Chromium browser to the application's local folder or some shared folder.
    // If you know the custom path to an installed Chromium-based browser,
    // use it instead of the above-mentioned options.
    // The BrowserFetcher class can be used to install or fetch an already
    // installed browser, you can then use the BrowserFetcher.GetDownloadedPath()
    // to get the path to the browser. See the BrowserFetcher class for methods
    // retrieving the path to Chrome or Edge executables and for other
    // options and methods that help to download Chromium browser
    // to a local folder if necessary.
    // See the Util.NewHtmlBrowser() utility method used by this sample for a
    // implementation example.
    // The above notes apply to any project that uses GcHtml.
    public class HelloWorldHtml
        public GcBitmap GenerateImage(Size pixelSize, float dpi, bool opaque, string[] sampleParams = null)
            // HTML code that represents the content to render:
            var html = "<!DOCTYPE html>" +
                "<html>" +
                "<head>" +
                "<style>" +
                "span.bold {" +
                    "font-weight: bold;" +
                "}" +
                "p.round {" +
                    "font: 36px arial, sans-serif;" +
                    "color: DarkSlateBlue;" +
                    "border: 4px solid SlateBlue;" +
                    "border-radius: 16px;" +
                    "padding: 3px 5px 3px 5px;" +
                    "text-shadow: 3px 2px LightSkyBlue;" +
                "}" +
                "</style>" +
                "</head>" +
                "<body>" +
                "<p class='round'>Hello, World, from <span class='bold'>GcHtml</span>!</p>" +
                "</body>" +

            var margin = dpi;
            var bmp = new GcBitmap(pixelSize.Width, pixelSize.Height, true, dpi, dpi);
            using (var g = bmp.CreateGraphics(Color.White))
                // Create an instance of GcHtmlBrowser that is used to render HTML:
                using var browser = Common.Util.NewHtmlBrowser();

                // Render HTML.
                // The return value from DrawHtml() indicates whether anything has been rendered.
                // The output parameter 'size' returns the actual size of the rendered content.
                var ok = g.DrawHtml(browser, html,
                    margin, margin,
                    new HtmlToImageFormat(true)
                        WindowSize = new Size((int)(pixelSize.Height - margin * 2), (int)(pixelSize.Width - margin * 2))
                    out SizeF size);

                // If anything has been rendered, draw an extra border around the rendered content:
                if (ok)
                    var rc = new RectangleF(margin - 4, margin - 4, size.Width + 8, size.Height + 8);
                    g.DrawRoundRect(rc, 8, Color.PaleVioletRed);
                else if (!string.IsNullOrEmpty(browser.ErrorLog))
                    // Optional diagnostics that may be useful when diagnosing browser errors.
                    // Note that the error log may contain harmless information messages
                    // even if there were no errors, so testing whether the error log is empty
                    // should not be used as the error indicator.
                    Common.Util.AddNote(browser.ErrorLog, g,
                        new RectangleF(margin, margin + size.Height + 36, bmp.PixelWidth - margin * 2, bmp.PixelHeight - size.Height - margin * 2));
            return bmp;