//
// Copyright (c) 2022, Brian Frank and Andy Frank
// Licensed under the Academic Free License version 3.0
//
// History:
//   28 Feb 2022  Brian Frank  Creation
//

**
** Graphics is used to draw 2D graphics.
**
@Js
mixin Graphics
{

  ** Current paint defines how text and shapes are stroked and filled
  abstract Paint paint

  ** Convenience for setting paint to a solid color.  If the paint
  ** is currently not a solid color, then get returns `Paint.asColorPaint`.
  abstract Color color

  ** Current stroke defines how the shapes are outlined
  abstract Stroke stroke

  ** Global alpha value used to control opacity for rending.
  ** The value must be between 0.0 (transparent) and 1.0 (opaue).
  abstract Float alpha

  ** Current font used for drawing text
  abstract Font font

  ** Get font metrics for the current font
  abstract FontMetrics metrics()

  ** Begin a new path operation to stroke, fill, or clip a shape.
  abstract GraphicsPath path()

  ** Draw a line with the current stroke and paint.
  abstract This drawLine(Float x1, Float y1, Float x2, Float y2)

  ** Draw a rectangle with the current stroke and paint.
  abstract This drawRect(Float x, Float y, Float w, Float h)

  ** Fill a rectangle with the current paint.
  abstract This fillRect(Float x, Float y, Float w, Float h)

  ** Convenience to clip the given the rectangle.  This sets the
  ** clipping area to the intersection of the current clipping region
  ** and the specified rectangle.
  abstract This clipRect(Float x, Float y, Float w, Float h)

  ** Draw a rectangle with rounded corners with the current stroke and paint.
  ** The ellipse of the corners is specified by wArc and hArc.
  abstract This drawRoundRect(Float x, Float y, Float w, Float h, Float wArc, Float hArc)

  ** Fill a rectangle with rounded corners with the current paint.
  ** The ellipse of the corners is specified by wArc and hArc.
  abstract This fillRoundRect(Float x, Float y, Float w, Float h, Float wArc, Float hArc)

  ** Clip a rectangle with rounded corners with the current paint.
  ** The ellipse of the corners is specified by wArc and hArc.
  abstract This clipRoundRect(Float x, Float y, Float w, Float h, Float wArc, Float hArc)

  ** Draw an ellipse within the given bounds with the current stroke and paint.
  abstract This drawEllipse(Float x, Float y, Float w, Float h)

  ** Fill an ellipse within the given bounds with the current stroke and paint.
  abstract This fillEllipse(Float x, Float y, Float w, Float h)

  ** Draw a the text string with the current paint and font.  The x, y
  ** coordinate specifies the left baseline corner of where the text
  ** is to be drawn.  Technically this is a fill operation similiar to
  ** the Canvas fillText function (there is currently no support to
  ** stroke/outline text).
  abstract This drawText(Str s, Float x, Float y)

  ** Draw an image at the given coordinate for the top/left corner.
  ** If the width or height does not correspond to the image's natural size
  ** then the image is scaled to fit.
  abstract This drawImage(Image img, Float x, Float y, Float w := img.w, Float h := img.h)

  ** Draw a rectangular region of the source image to the drawing surface.
  ** The src rectangle defines the subregion of the source image to use.  The
  ** dst rectangle identifies the destination location.  If the src size
  ** does not correspond to the dst size, then the image is scaled to fit.
  abstract This drawImageRegion(Image img, Rect src, Rect dst)

  ** Translate the coordinate system to the new origin.
  ** This call is a convenience for:
  **   transform(Transform.translate(x, y))
  abstract This translate(Float x, Float y)

  ** Perform an affine transformation on the coordinate system
  abstract This transform(Transform transform)

  ** Push the current graphics state onto an internal stack.  Reset the
  ** state back to its current state via `pop`.  If 'r' is non-null, the
  ** graphics state is automatically translated and clipped to the bounds.
  abstract This push(Rect? r := null)

  ** Pop the graphics stack and reset the state to the the last `push`.
  abstract This pop()

  ** Dispose of this graphics context and release underyling OS resources.
  abstract Void dispose()

}