#ifndef _ofxDraw_h_
#define _ofxDraw_h_

#include "ofxCore.h"
#include "ofxPixels.h"

// Copyright OpenFX and contributors to the OpenFX project.
// SPDX-License-Identifier: BSD-3-Clause


#ifdef __cplusplus
extern "C" {
#endif

/** @file ofxDrawSuite.h
API for host- and GPU API-independent drawing.
@version Added in OpenFX 1.5
*/


/** @brief the string that names the DrawSuite, passed to OfxHost::fetchSuite */
#define kOfxDrawSuite "OfxDrawSuite"

/** @brief Blind declaration of an OFX drawing context
 */
typedef struct OfxDrawContext *OfxDrawContextHandle;

/** @brief The Draw Context handle

 - Type - pointer X 1
 - Property Set - read only property on the inArgs of the following actions...
 - ::kOfxInteractActionDraw
 */
#define kOfxInteractPropDrawContext "OfxInteractPropDrawContext"

/** @brief Defines valid values for OfxDrawSuiteV1::getColour */
typedef enum OfxStandardColour
{
	kOfxStandardColourOverlayBackground,
	kOfxStandardColourOverlayActive,
	kOfxStandardColourOverlaySelected,
	kOfxStandardColourOverlayDeselected,
	kOfxStandardColourOverlayMarqueeFG,
	kOfxStandardColourOverlayMarqueeBG,
	kOfxStandardColourOverlayText
} OfxStandardColour;

/** @brief Defines valid values for OfxDrawSuiteV1::setLineStipple */
typedef enum OfxDrawLineStipplePattern
{
	kOfxDrawLineStipplePatternSolid,	// -----
	kOfxDrawLineStipplePatternDot,		// .....
	kOfxDrawLineStipplePatternDash,		// - - -
	kOfxDrawLineStipplePatternAltDash,	//  - - -
	kOfxDrawLineStipplePatternDotDash	// .-.-.-
} OfxDrawLineStipplePattern;

/** @brief Defines valid values for OfxDrawSuiteV1::draw */

typedef enum OfxDrawPrimitive
{
	kOfxDrawPrimitiveLines,
	kOfxDrawPrimitiveLineStrip,
	kOfxDrawPrimitiveLineLoop,
	kOfxDrawPrimitiveRectangle,
	kOfxDrawPrimitivePolygon,
	kOfxDrawPrimitiveEllipse
} OfxDrawPrimitive;

/** @brief Defines text alignment values for OfxDrawSuiteV1::drawText */
typedef enum OfxDrawTextAlignment
{
	kOfxDrawTextAlignmentLeft     = 0x0001,
	kOfxDrawTextAlignmentRight    = 0x0002,
	kOfxDrawTextAlignmentTop      = 0x0004,
	kOfxDrawTextAlignmentBottom   = 0x0008,
	kOfxDrawTextAlignmentBaseline = 0x0010,
	kOfxDrawTextAlignmentCenterH  = (kOfxDrawTextAlignmentLeft | kOfxDrawTextAlignmentRight),
	kOfxDrawTextAlignmentCenterV  = (kOfxDrawTextAlignmentTop | kOfxDrawTextAlignmentBaseline)
} OfxDrawTextAlignment;

/** @brief OFX suite that allows an effect to draw to a host-defined display context.

*/
typedef struct OfxDrawSuiteV1 {
	/** @brief Retrieves the host's desired draw colour for

	 \arg \c context  draw context
	 \arg \c std_colour desired colour type
	 \arg \c colour      returned RGBA colour

	 @returns
	 - ::kOfxStatOK - the colour was returned
	 - ::kOfxStatErrValue - std_colour was invalid
	 - ::kOfxStatFailed - failure, e.g. if function is called outside kOfxInteractActionDraw
	 */
	OfxStatus (*getColour)(OfxDrawContextHandle context, OfxStandardColour std_colour, OfxRGBAColourF *colour);

	/** @brief Sets the colour for future drawing operations (lines, filled shapes and text)

	 \arg \c context  draw context
	 \arg \c colour      RGBA colour

	 The host should use "over" compositing when using a non-opaque colour.
	
	 @returns
	 - ::kOfxStatOK - the colour was changed
	 - ::kOfxStatFailed - failure, e.g. if function is called outside kOfxInteractActionDraw
	 */
	OfxStatus (*setColour)(OfxDrawContextHandle context, const OfxRGBAColourF *colour);

	/** @brief Sets the line width for future line drawing operations

	 \arg \c context  draw context
	 \arg \c width     line width

	 Use width 0 for a single pixel line or non-zero for a smooth line of the desired width

	 The host should adjust for screen density.

	 @returns
	 - ::kOfxStatOK - the width was changed
	 - ::kOfxStatFailed - failure, e.g. if function is called outside kOfxInteractActionDraw
	 */
	OfxStatus (*setLineWidth)(OfxDrawContextHandle context, float width);

	/** @brief Sets the stipple pattern for future line drawing operations

	 \arg \c context  draw context
	 \arg \c pattern  desired stipple pattern

	 @returns
	 - ::kOfxStatOK - the pattern was changed
	 - ::kOfxStatErrValue - pattern was not valid
	 - ::kOfxStatFailed - failure, e.g. if function is called outside kOfxInteractActionDraw
	 */
	OfxStatus (*setLineStipple)(OfxDrawContextHandle context, OfxDrawLineStipplePattern pattern);

	/** @brief Draws a primitive of the desired type

	 \arg \c context  draw context
	 \arg \c primitive  desired primitive
	 \arg \c points  array of points in the primitive
	 \arg \c point_count  number of points in the array

	 kOfxDrawPrimitiveLines - like GL_LINES, n points draws n/2 separated lines
	 kOfxDrawPrimitiveLineStrip - like GL_LINE_STRIP, n points draws n-1 connected lines
	 kOfxDrawPrimitiveLineLoop - like GL_LINE_LOOP, n points draws n connected lines
	 kOfxDrawPrimitiveRectangle - draws an axis-aligned filled rectangle defined by 2 opposite corner points
	 kOfxDrawPrimitivePolygon - like GL_POLYGON, draws a filled n-sided polygon
	 kOfxDrawPrimitiveEllipse - draws a axis-aligned elliptical line (not filled) within the rectangle defined by 2 opposite corner points

	 @returns
	 - ::kOfxStatOK - the draw was completed
	 - ::kOfxStatErrValue - invalid primitive, or point_count not valid for primitive
	 - ::kOfxStatFailed - failure, e.g. if function is called outside kOfxInteractActionDraw
	 */
	OfxStatus (*draw)(OfxDrawContextHandle context, OfxDrawPrimitive primitive, const OfxPointD *points, int point_count);


	/** @brief Draws text at the specified position

	 \arg \c context  draw context
	 \arg \c text  text to draw (UTF-8 encoded)
	 \arg \c pos  position at which to align the text
	 \arg \c alignment  text alignment flags (see kOfxDrawTextAlignment*)

	 The text font face and size are determined by the host.

	 @returns
	 - ::kOfxStatOK - the text was drawn
	 - ::kOfxStatErrValue - text or pos were not defined
	 - ::kOfxStatFailed - failure, e.g. if function is called outside kOfxInteractActionDraw
	 */
	OfxStatus (*drawText)(OfxDrawContextHandle context, const char *text, const OfxPointD *pos, int alignment);

} OfxDrawSuiteV1;

#ifdef __cplusplus
}
#endif

#endif
