H. Utku Maden
9339295378
I have had a long break from this project due to other higher priority things going on in my life. Big changes inbound.
645 lines
17 KiB
C#
645 lines
17 KiB
C#
namespace Quik
|
|
{
|
|
/// <summary>
|
|
/// Enumeration of QUIK commands.
|
|
/// </summary>
|
|
public enum QuikCommandType
|
|
{
|
|
/// <summary>
|
|
/// Nothing.
|
|
/// </summary>
|
|
/// <seealso cref="QuikCommandNone"/>
|
|
None,
|
|
|
|
/// <summary>
|
|
/// Set a mask region.
|
|
/// </summary>
|
|
Mask,
|
|
|
|
/// <summary>
|
|
/// Draw a line.
|
|
/// </summary>
|
|
/// <seealso cref="QuikCommandLine"/>
|
|
Line,
|
|
|
|
/// <summary>
|
|
/// Draw multiple lines.
|
|
/// </summary>
|
|
Lines,
|
|
|
|
/// <summary>
|
|
/// Draw a Bezier curve.
|
|
/// </summary>
|
|
Bezier,
|
|
|
|
/// <summary>
|
|
/// Draw a rectangle.
|
|
/// </summary>
|
|
Rectangle,
|
|
|
|
/// <summary>
|
|
/// Draw multiple rectangles.
|
|
/// </summary>
|
|
Rectangles,
|
|
|
|
/// <summary>
|
|
/// Draw an ellipse.
|
|
/// </summary>
|
|
Ellipse,
|
|
|
|
/// <summary>
|
|
/// Draw multiple ellipses.
|
|
/// </summary>
|
|
Ellipses,
|
|
|
|
/// <summary>
|
|
/// Draw a triangle.
|
|
/// </summary>
|
|
Triangle,
|
|
|
|
/// <summary>
|
|
/// Draw multiple triangles.
|
|
/// </summary>
|
|
Triangles,
|
|
|
|
/// <summary>
|
|
/// Draw a polygon.
|
|
/// </summary>
|
|
Polygon,
|
|
|
|
/// <summary>
|
|
/// Put a character.
|
|
/// </summary>
|
|
PutChar,
|
|
|
|
/// <summary>
|
|
/// Put text.
|
|
/// </summary>
|
|
PutText,
|
|
|
|
/// <summary>
|
|
/// Flow text in box.
|
|
/// </summary>
|
|
FlowText,
|
|
|
|
EmitTypeset,
|
|
|
|
/// <summary>
|
|
/// Clear the image mask.
|
|
/// </summary>
|
|
StencilMaskClear,
|
|
|
|
/// <summary>
|
|
/// Create an image mask with the following commands.
|
|
/// </summary>
|
|
StencilMaskBegin,
|
|
|
|
/// <summary>
|
|
/// End the image mask commands.
|
|
/// </summary>
|
|
StencilMaskEnd,
|
|
|
|
/// <summary>
|
|
/// Draw an image.
|
|
/// </summary>
|
|
Image,
|
|
|
|
/// <summary>
|
|
/// Begin defining custom commands after this value.
|
|
/// </summary>
|
|
/// <seealso cref="QuikCommand"/>
|
|
CustomCommandRange = 1024,
|
|
}
|
|
|
|
/// <summary>
|
|
/// A single QUIK command.
|
|
/// </summary>
|
|
public abstract class QuikCommand
|
|
{
|
|
/// <summary>
|
|
/// The type ID for the QUIK command.
|
|
/// </summary>
|
|
public abstract QuikCommandType Type { get; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Does nothing.
|
|
/// </summary>
|
|
public sealed class QuikCommandNone : QuikCommand
|
|
{
|
|
/// <inheritdoc/>
|
|
public override QuikCommandType Type => QuikCommandType.None;
|
|
}
|
|
|
|
public sealed class QuikCommandMask : QuikCommand
|
|
{
|
|
/// <inheritdoc/>
|
|
public override QuikCommandType Type => QuikCommandType.Mask;
|
|
|
|
public QuikRectangle Bounds { get; }
|
|
|
|
public QuikCommandMask(QuikRectangle bounds)
|
|
{
|
|
Bounds = bounds;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Draws a line.
|
|
/// </summary>
|
|
public sealed class QuikCommandLine : QuikCommand
|
|
{
|
|
/// <inheritdoc/>
|
|
public override QuikCommandType Type => QuikCommandType.Line;
|
|
|
|
/// <summary>
|
|
/// The line to draw.
|
|
/// </summary>
|
|
public QuikLine Line { get; }
|
|
|
|
/// <summary>
|
|
/// Stroke style of the line.
|
|
/// </summary>
|
|
public QuikStrokeStyle Style { get; set; }
|
|
|
|
/// <summary>
|
|
/// Create a draw line command.
|
|
/// </summary>
|
|
/// <param name="line">The line to draw.</param>
|
|
public QuikCommandLine(QuikLine line)
|
|
{
|
|
Line = line;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Draw multiple lines.
|
|
/// </summary>
|
|
public sealed class QuikCommandLines : QuikCommand
|
|
{
|
|
/// <inheritdoc/>
|
|
public override QuikCommandType Type => QuikCommandType.Lines;
|
|
|
|
/// <summary>
|
|
/// The array of lines to draw.
|
|
/// </summary>
|
|
public QuikLine[] Lines { get; }
|
|
|
|
/// <summary>
|
|
/// Stroke style of the lines.
|
|
/// </summary>
|
|
public QuikStrokeStyle Style { get; set; }
|
|
|
|
/// <summary>
|
|
/// Create a draw lines command.
|
|
/// </summary>
|
|
/// <param name="lines">The lines to draw.</param>
|
|
public QuikCommandLines(QuikLine[] lines)
|
|
{
|
|
Lines = lines;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Draw a Bezier curve.
|
|
/// </summary>
|
|
public sealed class QuikCommandBezier : QuikCommand
|
|
{
|
|
/// <inheritdoc/>
|
|
public override QuikCommandType Type => QuikCommandType.Bezier;
|
|
|
|
/// <summary>
|
|
/// The Bezier curve segments to draw.
|
|
/// </summary>
|
|
public QuikBezier[] Segments;
|
|
|
|
/// <summary>
|
|
/// Stroke style of the curve.
|
|
/// </summary>
|
|
public QuikStrokeStyle Style { get; set; }
|
|
|
|
/// <summary>
|
|
/// Create a draw Bezier curve command.
|
|
/// </summary>
|
|
/// <param name="segments">The Bezier curve segments to draw.</param>
|
|
public QuikCommandBezier(QuikBezier[] segments)
|
|
{
|
|
Segments = segments;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Draw a rectangle.
|
|
/// </summary>
|
|
public sealed class QuikCommandRectangle : QuikCommand
|
|
{
|
|
/// <inheritdoc/>
|
|
public override QuikCommandType Type => QuikCommandType.Rectangle;
|
|
|
|
/// <summary>
|
|
/// The rectangle to draw.
|
|
/// </summary>
|
|
public QuikRectangle Rectangle { get; }
|
|
|
|
/// <summary>
|
|
/// Stroke style of the border.
|
|
/// </summary>
|
|
public QuikStrokeStyle StrokeStyle { get; set; }
|
|
|
|
/// <summary>
|
|
/// Fill style of the contents.
|
|
/// </summary>
|
|
public QuikFillStyle FillStyle { get; set; }
|
|
|
|
/// <summary>
|
|
/// Radius for round corners.
|
|
/// </summary>
|
|
public float CornerRadius { get; set; }
|
|
|
|
/// <summary>
|
|
/// Create a draw rectangle command.
|
|
/// </summary>
|
|
/// <param name="rectangle">The rectangle to draw.</param>
|
|
public QuikCommandRectangle(QuikRectangle rectangle)
|
|
{
|
|
Rectangle = rectangle;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Draw rectangles.
|
|
/// </summary>
|
|
public sealed class QuikCommandRectangles : QuikCommand
|
|
{
|
|
/// <inheritdoc/>
|
|
public override QuikCommandType Type => QuikCommandType.Rectangles;
|
|
|
|
/// <summary>
|
|
/// The rectangles to draw.
|
|
/// </summary>
|
|
public QuikRectangle[] Rectangles { get; }
|
|
|
|
/// <summary>
|
|
/// Stroke style of the border.
|
|
/// </summary>
|
|
public QuikStrokeStyle StrokeStyle { get; set; }
|
|
|
|
/// <summary>
|
|
/// Fill style of the contents.
|
|
/// </summary>
|
|
public QuikFillStyle FillStyle { get; set; }
|
|
|
|
/// <summary>
|
|
/// Radius for round corners.
|
|
/// </summary>
|
|
public float CornerRadius { get; set; }
|
|
|
|
/// <summary>
|
|
/// Create a draw rectangles commands.
|
|
/// </summary>
|
|
/// <param name="rectangles">The rectangles to draw.</param>
|
|
public QuikCommandRectangles(QuikRectangle[] rectangles)
|
|
{
|
|
Rectangles = rectangles;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Draw an ellipse.
|
|
/// </summary>
|
|
public sealed class QuikCommandEllipse : QuikCommand
|
|
{
|
|
/// <inheritdoc/>
|
|
public override QuikCommandType Type => QuikCommandType.Ellipse;
|
|
|
|
/// <summary>
|
|
/// The ellipse to draw.
|
|
/// </summary>
|
|
public QuikEllipse Ellipse { get; }
|
|
|
|
/// <summary>
|
|
/// Stroke style of the border.
|
|
/// </summary>
|
|
public QuikStrokeStyle StrokeStyle { get; set; }
|
|
|
|
/// <summary>
|
|
/// Fill style of the contents.
|
|
/// </summary>
|
|
public QuikFillStyle FillStyle { get; set; }
|
|
|
|
/// <summary>
|
|
/// Create a draw ellipse command.
|
|
/// </summary>
|
|
/// <param name="ellipse">The ellipse to draw.</param>
|
|
public QuikCommandEllipse(QuikEllipse ellipse)
|
|
{
|
|
Ellipse = ellipse;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Draw ellipses.
|
|
/// </summary>
|
|
public sealed class QuikCommandEllipses : QuikCommand
|
|
{
|
|
/// <inheritdoc/>
|
|
public override QuikCommandType Type => QuikCommandType.Ellipses;
|
|
|
|
/// <summary>
|
|
/// The ellipses to draw.
|
|
/// </summary>
|
|
public QuikEllipse[] Ellipses { get; }
|
|
|
|
/// <summary>
|
|
/// Stroke style of the border.
|
|
/// </summary>
|
|
public QuikStrokeStyle StrokeStyle { get; set; }
|
|
|
|
/// <summary>
|
|
/// Fill style of the contents.
|
|
/// </summary>
|
|
public QuikFillStyle FillStyle { get; set; }
|
|
|
|
/// <summary>
|
|
/// Create a draw ellipses command.
|
|
/// </summary>
|
|
/// <param name="ellipses">The ellipses to draw.</param>
|
|
public QuikCommandEllipses(QuikEllipse[] ellipses)
|
|
{
|
|
Ellipses = ellipses;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Create a draw triangle command.
|
|
/// </summary>
|
|
public sealed class QuikCommandTriangle : QuikCommand
|
|
{
|
|
/// <inheritdoc/>
|
|
public override QuikCommandType Type => QuikCommandType.Triangle;
|
|
|
|
/// <summary>
|
|
/// The triangle to draw.
|
|
/// </summary>
|
|
public QuikTriangle Triangle { get; }
|
|
|
|
/// <summary>
|
|
/// Stroke style of the border.
|
|
/// </summary>
|
|
public QuikStrokeStyle StrokeStyle { get; set; }
|
|
|
|
/// <summary>
|
|
/// Fill style of the contents.
|
|
/// </summary>
|
|
public QuikFillStyle FillStyle { get; set; }
|
|
|
|
/// <summary>
|
|
/// Create a draw triangle command.
|
|
/// </summary>
|
|
/// <param name="triangle">The triangles to draw.</param>
|
|
public QuikCommandTriangle(QuikTriangle triangle)
|
|
{
|
|
Triangle = triangle;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Draw triangles.
|
|
/// </summary>
|
|
public sealed class QuikCommandTriangles : QuikCommand
|
|
{
|
|
/// <inheritdoc/>
|
|
public override QuikCommandType Type => QuikCommandType.Triangles;
|
|
|
|
/// <summary>
|
|
/// The triangles to draw.
|
|
/// </summary>
|
|
public QuikTriangle[] Triangles { get; }
|
|
|
|
/// <summary>
|
|
/// Stroke style of the border.
|
|
/// </summary>
|
|
public QuikStrokeStyle StrokeStyle { get; set; }
|
|
|
|
/// <summary>
|
|
/// Fill style of the contents.
|
|
/// </summary>
|
|
public QuikFillStyle FillStyle { get; set; }
|
|
|
|
/// <summary>
|
|
/// Create a draw triangles command.
|
|
/// </summary>
|
|
/// <param name="triangles">The triangles to draw.</param>
|
|
public QuikCommandTriangles(QuikTriangle[] triangles)
|
|
{
|
|
Triangles = triangles;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Draw a polygon.
|
|
/// </summary>
|
|
/// <remarks>Behavior is defined by rendering backend for concave polygons.</remarks>
|
|
public sealed class QuikCommandPolygon : QuikCommand
|
|
{
|
|
/// <inheritdoc/>
|
|
public override QuikCommandType Type => QuikCommandType.Polygon;
|
|
|
|
/// <summary>
|
|
/// The vertices that make up the polygon.
|
|
/// </summary>
|
|
public QuikVec2[] Polygon { get; }
|
|
|
|
/// <summary>
|
|
/// Stroke style of the border.
|
|
/// </summary>
|
|
public QuikStrokeStyle StrokeStyle { get; set; }
|
|
|
|
/// <summary>
|
|
/// Fill style of the contents.
|
|
/// </summary>
|
|
public QuikFillStyle FillStyle { get; set; }
|
|
|
|
/// <summary>
|
|
/// Create a draw polygon command.
|
|
/// </summary>
|
|
/// <param name="polygon">The polygon to draw.</param>
|
|
public QuikCommandPolygon(QuikVec2[] polygon)
|
|
{
|
|
Polygon = polygon;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Put a character.
|
|
/// </summary>
|
|
public sealed class QuikCommandPutChar : QuikCommand
|
|
{
|
|
/// <inheritdoc/>
|
|
public override QuikCommandType Type => QuikCommandType.PutChar;
|
|
|
|
/// <summary>
|
|
/// The character to put.
|
|
/// </summary>
|
|
/// <remarks>This field is integer to accomodate for surrogate pairs.</remarks>
|
|
public int Character { get; }
|
|
|
|
/// <summary>
|
|
/// The baseline start position of the character.
|
|
/// </summary>
|
|
public QuikVec2 Position { get; }
|
|
|
|
/// <summary>
|
|
/// Create a put character command.
|
|
/// </summary>
|
|
/// <param name="character">The character to put.</param>
|
|
/// <param name="position">The baseline start position of the character.</param>
|
|
public QuikCommandPutChar(int character, QuikVec2 position)
|
|
{
|
|
Character = character;
|
|
Position = position;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Create a put character command.
|
|
/// </summary>
|
|
/// <param name="character">The character to put.</param>
|
|
/// <param name="position">The baseline start position of the character.</param>
|
|
public QuikCommandPutChar(char character, QuikVec2 position) : this((int) character, position)
|
|
{
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Put some text.
|
|
/// </summary>
|
|
public sealed class QuikCommandPutText : QuikCommand
|
|
{
|
|
/// <inheritdoc/>
|
|
public override QuikCommandType Type => QuikCommandType.PutText;
|
|
|
|
/// <summary>
|
|
/// The text to put.
|
|
/// </summary>
|
|
public string Text { get; }
|
|
|
|
/// <summary>
|
|
/// The baseline start position of the text.
|
|
/// </summary>
|
|
public QuikVec2 Position { get; }
|
|
|
|
/// <summary>
|
|
/// Create a put text command.
|
|
/// </summary>
|
|
/// <param name="text">The text to put.</param>
|
|
/// <param name="position">The baseline start position of the text.</param>
|
|
public QuikCommandPutText(string text, QuikVec2 position)
|
|
{
|
|
Text = text;
|
|
Position = position;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Flow text into a box.
|
|
/// </summary>
|
|
public sealed class QuikCommandFlowText : QuikCommand
|
|
{
|
|
/// <inheritdoc/>
|
|
public override QuikCommandType Type => QuikCommandType.FlowText;
|
|
|
|
/// <summary>
|
|
/// The text to flow.
|
|
/// </summary>
|
|
public string Text { get; }
|
|
|
|
/// <summary>
|
|
/// The flowing box boundaries.
|
|
/// </summary>
|
|
public QuikRectangle Bounds { get; }
|
|
|
|
/// <summary>
|
|
/// Create a flow text command.
|
|
/// </summary>
|
|
/// <param name="text">The text to flow.</param>
|
|
/// <param name="bounds">The flowing box boundaries.</param>
|
|
public QuikCommandFlowText(string text, QuikRectangle bounds)
|
|
{
|
|
Text = text;
|
|
Bounds = bounds;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Emit previously typeset text.
|
|
/// </summary>
|
|
public sealed class QuikCommandEmitText : QuikCommand
|
|
{
|
|
/// <inheritdoc/>
|
|
public override QuikCommandType Type => QuikCommandType.EmitTypeset;
|
|
|
|
/// <summary>
|
|
/// The typeset group to emit.
|
|
/// </summary>
|
|
public Typography.TypesetGroup Group { get; }
|
|
|
|
public QuikVec2 Offset { get; }
|
|
|
|
/// <summary>
|
|
/// Create an emit typeset text command.
|
|
/// </summary>
|
|
/// <param name="group">The typeset group to emit.</param>
|
|
public QuikCommandEmitText(Typography.TypesetGroup group)
|
|
{
|
|
Group = group;
|
|
Offset = new QuikVec2(0, 0);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Create an emit typeset text command.
|
|
/// </summary>
|
|
/// <param name="group">The typeset group to emit.</param>
|
|
/// <param name="offset">The offset to emit at.</param>
|
|
public QuikCommandEmitText(Typography.TypesetGroup group, QuikVec2 offset)
|
|
{
|
|
Group = group;
|
|
Offset = offset;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Clear the stencil buffer.
|
|
/// </summary>
|
|
public sealed class QuikCommandStencilClear : QuikCommand
|
|
{
|
|
/// <inheritdoc/>
|
|
public override QuikCommandType Type => QuikCommandType.StencilMaskClear;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Begin rendering to the stencil buffer.
|
|
/// </summary>
|
|
public sealed class QuikCommandStencilBegin : QuikCommand
|
|
{
|
|
/// <inheritdoc/>
|
|
public override QuikCommandType Type => QuikCommandType.StencilMaskBegin;
|
|
}
|
|
|
|
/// <summary>
|
|
/// End rendering to the stencil buffer.
|
|
/// </summary>
|
|
public sealed class QuikCommandStencilEnd : QuikCommand
|
|
{
|
|
/// <inheritdoc/>
|
|
public override QuikCommandType Type => QuikCommandType.StencilMaskEnd;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Draw an image.
|
|
/// </summary>
|
|
public sealed class QuikCommandImage : QuikCommand
|
|
{
|
|
/// <inheritdoc/>
|
|
public override QuikCommandType Type => QuikCommandType.Image;
|
|
}
|
|
} |