/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
// Original file Copyright Crytek GMBH or its affiliates, used under license.

// Description : DrawContext helper class for MiniGUI


#ifndef CRYINCLUDE_CRYSYSTEM_MINIGUI_DRAWCONTEXT_H
#define CRYINCLUDE_CRYSYSTEM_MINIGUI_DRAWCONTEXT_H
#pragma once


#include "ICryMiniGUI.h"
#include <Cry_Color.h>

struct IRenderAuxGeom;

MINIGUI_BEGIN

enum ETextAlign
{
    eTextAlign_Left,
    eTextAlign_Right,
    eTextAlign_Center
};

//////////////////////////////////////////////////////////////////////////
// Context of MiniGUI drawing.
//////////////////////////////////////////////////////////////////////////
class CDrawContext
{
public:
    CDrawContext(SMetrics* pMetrics);

    // Must be called before any drawing happens
    void StartDrawing();
    // Must be called after all drawing have been complete.
    void StopDrawing();

    void PushClientRect(const Rect& rc);
    void PopClientRect();

    SMetrics& Metrics() { return *m_pMetrics; }
    void SetColor(ColorB color);

    void DrawLine(float x0, float y0, float x1, float y1, float thickness = 1.0f);
    void DrawTriangle(float x0, float y0, float x1, float y1, float x2, float y2);
    void DrawRect(const Rect& rc);
    void DrawFrame(const Rect& rc, ColorB lineColor, ColorB solidColor, float thickness = 1.0f);

    void DrawString(float x, float y, float font_size, ETextAlign align, const char* format, ...);


protected:
    SMetrics* m_pMetrics;

    ColorB m_color;
    float m_defaultZ;
    IRenderAuxGeom* m_pAuxRender;
    uint32 m_prevRenderFlags;

    enum
    {
        MAX_ORIGIN_STACK = 16
    };

    int m_currentStackLevel;
    float m_x, m_y; // Reference X,Y positions
    Rect m_clientRectStack[MAX_ORIGIN_STACK];

    float m_frameWidth;
    float m_frameHeight;

private:
    TransformationMatrices m_backupSceneMatrices;
};

MINIGUI_END

#endif // CRYINCLUDE_CRYSYSTEM_MINIGUI_DRAWCONTEXT_H