/*++
Copyright (c) Microsoft Corporation
Licensed under the MIT license.

Module Name:
- IRenderer.hpp

Abstract:
- This serves as the entry point for console rendering activites.

Author(s):
- Michael Niksa (MiNiksa) 17-Nov-2015
--*/

#pragma once

#include "FontInfoDesired.hpp"
#include "IRenderEngine.hpp"
#include "IRenderTarget.hpp"
#include "../types/inc/viewport.hpp"

namespace Microsoft::Console::Render
{
    class IRenderer : public IRenderTarget
    {
    public:
        virtual ~IRenderer() = 0;

        [[nodiscard]] virtual HRESULT PaintFrame() = 0;

        virtual void TriggerSystemRedraw(const RECT* const prcDirtyClient) = 0;

        virtual void TriggerRedraw(const Microsoft::Console::Types::Viewport& region) = 0;
        virtual void TriggerRedraw(const COORD* const pcoord) = 0;
        virtual void TriggerRedrawCursor(const COORD* const pcoord) = 0;

        virtual void TriggerRedrawAll() = 0;
        virtual void TriggerTeardown() = 0;

        virtual void TriggerSelection() = 0;
        virtual void TriggerScroll() = 0;
        virtual void TriggerScroll(const COORD* const pcoordDelta) = 0;
        virtual void TriggerCircling() = 0;
        virtual void TriggerTitleChange() = 0;
        virtual void TriggerFontChange(const int iDpi,
                                       const FontInfoDesired& FontInfoDesired,
                                       _Out_ FontInfo& FontInfo) = 0;

        [[nodiscard]] virtual HRESULT GetProposedFont(const int iDpi,
                                                      const FontInfoDesired& FontInfoDesired,
                                                      _Out_ FontInfo& FontInfo) = 0;

        virtual bool IsGlyphWideByFont(const std::wstring_view glyph) = 0;

        virtual void EnablePainting() = 0;
        virtual void WaitForPaintCompletionAndDisable(const DWORD dwTimeoutMs) = 0;

        virtual void AddRenderEngine(_In_ IRenderEngine* const pEngine) = 0;
    };

    inline Microsoft::Console::Render::IRenderer::~IRenderer() {}

}
