'' This code is part of Document Solutions for Imaging demos.
'' Copyright (c) MESCIUS inc. All rights reserved.
Imports System.IO
Imports System.Drawing
Imports GrapeCity.Documents.Drawing
Imports GrapeCity.Documents.Imaging
Imports GrapeCity.Documents.Text
Imports GrapeCity.Documents.Html

'' This sample shows how to render a hard-coded HTML string.
'' Adding DsHtml to your projects:
'' - Public classes and extension methods that enable rendering HTML
''   are provided by the GrapeCity.Documents.Html (DsHtml) package.
'' - DsHtml supports Windows, macOS and Linux platforms.
'' Dealing with errors when using DsHtml:
'' - If DsHtml 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.
'' DsHtml 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 DsHtml.
Public Class HelloWorldHtml
    Function GenerateImage(
        ByVal pixelSize As Size,
        ByVal dpi As Single,
        ByVal opaque As Boolean,
        Optional ByVal sampleParams As String() = Nothing) As GcBitmap

        '' HTML code that represents the content to render:
        Const 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'>DsHtml</span>!</p>" +
            "</body>" +

        Dim margin = dpi
        Dim bmp = New GcBitmap(pixelSize.Width, pixelSize.Height, True, dpi, dpi)
        Using g = bmp.CreateGraphics(Color.White), browser = 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.
            Dim size As SizeF
            Dim ok = g.DrawHtml(browser, html,
                margin, margin,
                New HtmlToImageFormat(True) With {
                    .WindowSize = New Size(pixelSize.Height - margin * 2, pixelSize.Width - margin * 2)

            '' If anything has been rendered, draw an extra border around the rendered content:
            If ok Then
                Dim rc = New RectangleF(margin - 4, margin - 4, size.Width + 8, size.Height + 8)
                g.DrawRoundRect(rc, 8, Color.PaleVioletRed)
            ElseIf Not String.IsNullOrEmpty(browser.ErrorLog) Then
                '' 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.
                Util.AddNote(browser.ErrorLog, g,
                    New RectangleF(margin, margin + size.Height + 36, bmp.PixelWidth - margin * 2, bmp.PixelHeight - size.Height - margin * 2))
            End If
        End Using
        Return bmp
    End Function
End Class