5 Commits

51 changed files with 585 additions and 321 deletions

View File

@@ -12,13 +12,13 @@ namespace Dashboard.BlurgText
{
BlurgRect rect = result[i];
QRectangle pos = new QRectangle()
Rectangle pos = new Rectangle()
{
Min = origin + new Vector2(rect.X, rect.Y),
Size = new Vector2(rect.Width, rect.Height)
};
QRectangle uv = new QRectangle(rect.U1, rect.V1, rect.U0, rect.V0);
Rectangle uv = new Rectangle(rect.U1, rect.V1, rect.U0, rect.V0);
list.Image(blurg.Images[(int)rect.UserData], pos, uv);
}

View File

@@ -20,7 +20,7 @@ namespace Dashboard.BlurgText
private nint TextureAllocationCallback(int width, int height)
{
QImageBuffer image = new QImageBuffer(QImageFormat.RgbaU8, width, height);
QImageBuffer image = new QImageBuffer(ImageFormat.RgbaU8, width, height);
images.Add(image);
return images.Count - 1;
}
@@ -30,7 +30,7 @@ namespace Dashboard.BlurgText
if (width == 0 || height == 0)
return;
QImageLock src = new QImageLock(QImageFormat.RgbaU8, width, height, 1, buffer);
QImageLock src = new QImageLock(ImageFormat.RgbaU8, width, height, 1, buffer);
QImageBuffer image = images[(int)userData];
image.LockBits2d(out QImageLock dest, QImageLockOptions.Default);

View File

@@ -5,7 +5,7 @@ using System.Linq;
using System.Text.Json.Serialization;
using System.Text.Json;
using ReFuel.FreeType;
using Dashboard.Media.Font;
using Dashboard.Media.Fonts;
using Dashboard.PAL;
using Dashboard.Media.Defaults.Linux;

View File

@@ -6,7 +6,7 @@ using System.Text;
using ReFuel.FreeType;
using Dashboard.Media.Defaults.Fallback;
using Dashboard.Media.Defaults.Linux;
using Dashboard.Media.Font;
using Dashboard.Media.Fonts;
using Dashboard.PAL;
namespace Dashboard.Media.Defaults

View File

@@ -3,19 +3,19 @@ using System.Buffers;
using System.IO;
using ReFuel.FreeType;
using Dashboard.Media.Color;
using Dashboard.Media.Font;
using Dashboard.Media.Fonts;
using OpenTK.Mathematics;
namespace Dashboard.Media.Defaults
{
public class QFontFreeType : QFont
public class FontFreeType : Font
{
private MemoryStream ms;
private FTFace face;
public override FontFace Face => throw new NotImplementedException();
public QFontFreeType(Stream stream)
public FontFreeType(Stream stream)
{
ms = new MemoryStream();
stream.CopyTo(ms);
@@ -32,7 +32,7 @@ namespace Dashboard.Media.Defaults
return FT.GetCharIndex(face, (ulong)rune) != 0;
}
protected override QImage Render(out QGlyphMetrics metrics, int codepoint, float size, in FontRasterizerOptions options)
protected override Image Render(out GlyphMetrics metrics, int codepoint, float size, in FontRasterizerOptions options)
{
FT.SetCharSize(face, 0, (long)Math.Round(64*size), 0, (uint)Math.Round(options.Resolution));
@@ -40,7 +40,7 @@ namespace Dashboard.Media.Defaults
FT.LoadGlyph(face, index, FTLoadFlags.Default);
ref readonly FTGlyphMetrics ftmetrics = ref face.Glyph.Metrics;
metrics = new QGlyphMetrics(codepoint,
metrics = new GlyphMetrics(codepoint,
new Vector2(ftmetrics.Width/64f, ftmetrics.Height/64f),
new Vector2(ftmetrics.HorizontalBearingX/64f, ftmetrics.HorizontalBearingY/64f),
new Vector2(ftmetrics.VerticalBearingX/64f, ftmetrics.VerticalBearingY/64f),
@@ -55,7 +55,7 @@ namespace Dashboard.Media.Defaults
return null;
}
QImageBuffer image = new QImageBuffer(QImageFormat.AlphaU8, (int)bitmap.Width, (int)bitmap.Rows);
QImageBuffer image = new QImageBuffer(ImageFormat.AlphaU8, (int)bitmap.Width, (int)bitmap.Rows);
image.LockBits2d(out QImageLock lk, QImageLockOptions.Default);
unsafe

View File

@@ -7,11 +7,11 @@ namespace Dashboard.Media.Defaults
{
public class FreeTypeFontFactory : IFontFactory
{
public bool TryOpen(Stream stream, [NotNullWhen(true)] out QFont font)
public bool TryOpen(Stream stream, [NotNullWhen(true)] out Font font)
{
try
{
font = new QFontFreeType(stream);
font = new FontFreeType(stream);
return true;
}
catch

View File

@@ -5,7 +5,7 @@ using ReFuel.Stb;
namespace Dashboard.Media.Defaults
{
public unsafe class QImageStbi : QImage
public unsafe class ImageStbi : Image
{
private readonly StbImage image;
private QImageBuffer buffer;
@@ -17,9 +17,9 @@ namespace Dashboard.Media.Defaults
public override int Depth => 1;
public override bool IsSdf => isSdf;
public override QImageFormat InternalFormat => Stb2QImageFormat(image.Format);
public override ImageFormat InternalFormat => Stb2QImageFormat(image.Format);
public QImageStbi(Stream source)
public ImageStbi(Stream source)
{
// According to the stbi documentation, only a specific type of PNG
// files are premultiplied out of the box (iPhone PNG). Take the
@@ -30,15 +30,15 @@ namespace Dashboard.Media.Defaults
image = StbImage.Load(source);
}
public static QImageFormat Stb2QImageFormat(StbiImageFormat src)
public static ImageFormat Stb2QImageFormat(StbiImageFormat src)
{
switch (src)
{
case StbiImageFormat.Grey: return QImageFormat.RedU8;
case StbiImageFormat.Rgb: return QImageFormat.RgbU8;
case StbiImageFormat.Rgba: return QImageFormat.RgbaU8;
case StbiImageFormat.GreyAlpha: return QImageFormat.RaU8;
default: return QImageFormat.Undefined;
case StbiImageFormat.Grey: return ImageFormat.RedU8;
case StbiImageFormat.Rgb: return ImageFormat.RgbU8;
case StbiImageFormat.Rgba: return ImageFormat.RgbaU8;
case StbiImageFormat.GreyAlpha: return ImageFormat.RaU8;
default: return ImageFormat.Undefined;
}
}

View File

@@ -6,7 +6,7 @@ using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Text;
using ReFuel.FreeType;
using Dashboard.Media.Font;
using Dashboard.Media.Fonts;
using Dashboard.PAL;
namespace Dashboard.Media.Defaults.Linux

View File

@@ -4,7 +4,7 @@ using System.Collections;
using System.IO;
using System.Linq;
using System.Net;
using Dashboard.Media.Font;
using Dashboard.Media.Fonts;
// WebRequest is obsolete but runs on .NET framework.
#pragma warning disable SYSLIB0014

View File

@@ -10,13 +10,13 @@ using System.Collections.Generic;
namespace Dashboard.OpenTK
{
public class OpenTKPlatform : IDashboardPlatform
public class OpenTKPlatform : IDbPlatform
{
private readonly List<OpenTKPort> _ports = new List<OpenTKPort>();
// These shall remain a sad nop for now.
public string? Title { get; set; }
public QImage? Icon { get; set; } = null;
public Media.Image? Icon { get; set; } = null;
public event EventHandler? EventRaised;

View File

@@ -68,7 +68,7 @@ namespace Dashboard.OpenTK
public void Paint(DrawList queue)
{
QRectangle view = new QRectangle(Size, new Vector2(0, 0));
Rectangle view = new Rectangle(Size, new Vector2(0, 0));
_vertexEngine.Reset();
_vertexEngine.ProcessCommands(view, queue);

View File

@@ -12,13 +12,22 @@ namespace Dashboard.Controls
public bool IsReadOnly => false;
public event EventHandler<ChildEventArgs>? ChildAdded;
public event EventHandler<ChildEventArgs>? ChildRemoved;
public void Add(Control item)
{
children.Add(item);
OnChildAdded(new ChildEventArgs(item));
}
public void Clear()
{
foreach (Control child in this)
{
OnChildRemoved(new ChildEventArgs(child));
}
children.Clear();
}
@@ -39,7 +48,25 @@ namespace Dashboard.Controls
public bool Remove(Control item)
{
return children.Remove(item);
if (children.Remove(item))
{
OnChildRemoved(new ChildEventArgs(item));
return true;
}
return false;
}
public virtual void OnChildAdded(ChildEventArgs ea)
{
Adopt(ea.Child, this);
ChildAdded?.Invoke(this, ea);
}
public virtual void OnChildRemoved(ChildEventArgs ea)
{
Adopt(ea.Child, null);
ChildRemoved?.Invoke(this, ea);
}
IEnumerator IEnumerable.GetEnumerator()
@@ -47,4 +74,13 @@ namespace Dashboard.Controls
return children.GetEnumerator();
}
}
public class ChildEventArgs : EventArgs
{
public Control Child { get; }
public ChildEventArgs(Control child)
{
Child = child;
}
}
}

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using Dashboard.ImmediateDraw;
using OpenTK.Mathematics;
namespace Dashboard.Controls
{
@@ -8,6 +9,18 @@ namespace Dashboard.Controls
{
private readonly DrawList drawCommands = new DrawList();
public string? Id { get; set; }
public override Vector2 Position
{
get => base.Position;
set
{
base.Position = value;
InvalidateLayout();
}
}
public Style Style { get; set; } = new Style();
public float Padding
{
@@ -20,6 +33,8 @@ namespace Dashboard.Controls
protected bool IsLayoutSuspended { get; private set; } = false;
protected ResizedEventArgs? LastResizeEvent { get; private set; }
public void InvalidateVisual()
{
IsVisualsValid = false;
@@ -72,6 +87,14 @@ namespace Dashboard.Controls
cmd.Splice(drawCommands);
if (this is IEnumerable<Control> children)
{
foreach (Control child in children)
{
child.Paint(cmd);
}
}
cmd.PopViewport();
cmd.PopStyle();
}
@@ -108,18 +131,12 @@ namespace Dashboard.Controls
LayoutValidated?.Invoke(sender, ea);
}
protected void ValidateChildrenLayout()
public override void OnResized(object sender, ResizedEventArgs ea)
{
if (this is IEnumerable<Control> enumerable)
{
foreach (Control child in enumerable)
{
if (child.IsLayoutValid)
continue;
child.ValidateLayout();
}
}
base.OnResized(sender, ea);
LastResizeEvent = ea;
InvalidateLayout();
}
}
}

View File

@@ -17,7 +17,6 @@ namespace Dashboard.Controls
protected override void ValidateLayout()
{
ValidateChildrenLayout();
}
protected override void ValidateVisual(DrawList cmd)

View File

@@ -0,0 +1,31 @@
using Dashboard.ImmediateDraw;
using Dashboard.Layout;
using OpenTK.Mathematics;
namespace Dashboard.Controls
{
public class GridBox : ContainerControl
{
protected override void ValidateLayout()
{
if (LastResizeEvent != null)
{
foreach (Control child in this)
{
GridLayoutAttribute attribute = GridLayoutAttribute.GetGridLayout(child);
attribute.Evaluate(LastResizeEvent, child.Bounds, out Rectangle newBounds);
child.Bounds = newBounds;
child.InvalidateLayout();
}
}
}
protected override void ValidateVisual(DrawList cmd)
{
cmd.Rectangle(new Rectangle(Size, Vector2.Zero));
}
}
}

View File

@@ -8,7 +8,7 @@ namespace Dashboard.Controls
public class Label : Control
{
public string Text { get; set; } = string.Empty;
public QFont? Font { get; set; }
public Font? Font { get; set; }
public float TextSize { get; set; }
public bool AutoSize { get; set; } = true;

View File

@@ -1,22 +1,23 @@
using System;
using System.Collections.Generic;
using Dashboard.ImmediateDraw;
using OpenTK.Mathematics;
namespace Dashboard.Controls
{
/// <summary>
/// Bases for all UI elements.
/// </summary>
public abstract class UIBase
public abstract class UIBase : IDbAttribute
{
private Vector2 size;
public UIBase? Parent { get; protected set; }
public string? Id { get; set; }
public QRectangle Bounds
public Rectangle Bounds
{
get => new QRectangle(Position + Size, Position);
get => new Rectangle(Position + Size, Position);
set
{
Size = value.Size;
@@ -24,7 +25,7 @@ namespace Dashboard.Controls
}
}
public Vector2 Position { get; set; }
public virtual Vector2 Position { get; set; }
public Vector2 Size
{
@@ -38,7 +39,7 @@ namespace Dashboard.Controls
}
}
public QRectangle AbsoluteBounds
public Rectangle AbsoluteBounds
{
get
{
@@ -48,7 +49,7 @@ namespace Dashboard.Controls
}
else
{
return new QRectangle(Bounds.Max + Parent.Position, Bounds.Min + Parent.Position);
return new Rectangle(Bounds.Max + Parent.Position, Bounds.Min + Parent.Position);
}
}
}
@@ -59,6 +60,8 @@ namespace Dashboard.Controls
public bool IsMaximumSizeSet => MaximumSize != new Vector2(-1, -1);
public bool IsMinimumSizeSet => MinimumSize != new Vector2(-1, -1);
public Dictionary<string, object> Attributes { get; } = new Dictionary<string, object>();
public virtual void NotifyEvent(object? sender, EventArgs args)
{
}
@@ -82,11 +85,46 @@ namespace Dashboard.Controls
}
public event EventHandler<ResizedEventArgs>? Resized;
public event EventHandler<AdoptedEventArgs>? Adopted;
public virtual void OnResized(object sender, ResizedEventArgs ea)
{
Resized?.Invoke(sender, ea);
}
protected virtual void OnAdopted(UIBase? parent)
{
Adopted?.Invoke(this, new AdoptedEventArgs(parent));
}
public bool IsDisposed { get; private set; } = false;
protected virtual void Dispose(bool disposing)
{
foreach (object userdata in Attributes.Values)
{
if (userdata is IDisposable disposable)
disposable.Dispose();
}
}
protected void DisposeInvoker(bool disposing)
{
if (IsDisposed)
return;
IsDisposed = true;
Dispose(disposing);
}
public void Dispose() => DisposeInvoker(true);
protected static void Adopt(UIBase child, UIBase? parent)
{
child.Parent = parent;
child.OnAdopted(parent);
}
}
public class ResizedEventArgs : EventArgs
@@ -100,4 +138,14 @@ namespace Dashboard.Controls
OldSize = oldSize;
}
}
public class AdoptedEventArgs : EventArgs
{
public UIBase? Parent { get; }
public AdoptedEventArgs(UIBase? parent = null)
{
Parent = parent;
}
}
}

View File

@@ -17,7 +17,7 @@ namespace Dashboard
/// <summary>
/// The application platform driver.
/// </summary>
public IDashboardPlatform Platform { get; }
public IDbPlatform Platform { get; }
/// <summary>
/// Title of the application.
@@ -31,7 +31,7 @@ namespace Dashboard
/// <summary>
/// Application icon.
/// </summary>
public QImage? Icon
public Image? Icon
{
get => Platform.Icon;
set => Platform.Icon = value;
@@ -46,7 +46,7 @@ namespace Dashboard
/// </summary>
public List<MediaLoader> MediaLoaders { get; } = new List<MediaLoader>();
public DbApplication(IDashboardPlatform platform)
public DbApplication(IDbPlatform platform)
{
Platform = platform;
FontProvider = new FontProvider(this);

View File

@@ -8,7 +8,7 @@ namespace Dashboard
/// A bezier curve segment.
/// </summary>
[DebuggerDisplay("{Start} -- {ControlA} -- {ControlB} -- {End}")]
public struct QBezier
public struct Bezier
{
/// <summary>
/// Segment start point.
@@ -37,7 +37,7 @@ namespace Dashboard
0.5f * (End - Start).Length +
0.5f * ((ControlA - Start).Length + (ControlB - ControlA).Length + (End - ControlB).Length);
public QBezier(Vector2 start, Vector2 controlA, Vector2 controlB, Vector2 end)
public Bezier(Vector2 start, Vector2 controlA, Vector2 controlB, Vector2 end)
{
Start = start;
ControlA = controlA;
@@ -45,7 +45,7 @@ namespace Dashboard
End = end;
}
public QBezier(
public Bezier(
float startX,
float startY,
float controlAx,
@@ -104,7 +104,7 @@ namespace Dashboard
/// A line segment.
/// </summary>
[DebuggerDisplay("{Start} -- {End}")]
public struct QLine
public struct Line
{
/// <summary>
/// Start point.
@@ -116,13 +116,13 @@ namespace Dashboard
/// </summary>
public Vector2 End;
public QLine(Vector2 start, Vector2 end)
public Line(Vector2 start, Vector2 end)
{
Start = start;
End = end;
}
public QLine(float startX, float startY, float endX, float endY)
public Line(float startX, float startY, float endX, float endY)
{
Start.X = startX;
Start.Y = startY;
@@ -145,7 +145,7 @@ namespace Dashboard
/// A rectangle.
/// </summary>
[DebuggerDisplay("({Left}, {Top}, {Right}, {Bottom})")]
public struct QRectangle
public struct Rectangle
{
/// <summary>
/// Position maximum point.
@@ -187,13 +187,13 @@ namespace Dashboard
set => Max = Min + value;
}
public QRectangle(Vector2 max, Vector2 min)
public Rectangle(Vector2 max, Vector2 min)
{
Max = max;
Min = min;
}
public QRectangle(float r, float b, float l, float t)
public Rectangle(float r, float b, float l, float t)
{
Max = new Vector2(r, b);
Min = new Vector2(l, t);
@@ -212,8 +212,8 @@ namespace Dashboard
Max += offset;
}
public static QRectangle Intersect(in QRectangle a, in QRectangle b) =>
new QRectangle(
public static Rectangle Intersect(in Rectangle a, in Rectangle b) =>
new Rectangle(
Math.Max(a.Right, b.Right),
Math.Max(a.Bottom, b.Bottom)
,
@@ -226,7 +226,7 @@ namespace Dashboard
/// </summary>
/// <remarks>It is undefined to have an ellipse with non-orthogonal axes.</remarks>
[DebuggerDisplay("{Center} ellipse {AxisA}; {AxisB}")]
public struct QEllipse
public struct Ellipse
{
/// <summary>
/// Ellipse center point.
@@ -248,7 +248,7 @@ namespace Dashboard
/// A triangle.
/// </summary>
[DebuggerDisplay("{A} -- {B} -- {C}")]
public struct QTriangle
public struct Triangle
{
/// <summary>
/// First vertex.

21
Dashboard/IDbAttribute.cs Normal file
View File

@@ -0,0 +1,21 @@
using System;
using System.Collections.Generic;
namespace Dashboard
{
/// <summary>
/// Common interface for Dashboard objects that accept attributes.
/// </summary>
/// <remarks>
/// Dashboard will call dispose on any and all objects which implement IDisposable.
/// If this is an issue, please guard your object against this using a wrapper.
/// </remarks
public interface IDbAttribute : IDisposable
{
/// <summary>
/// Attribute dictionary.
/// </summary>
public Dictionary<string, object> Attributes { get; }
}
}

View File

@@ -10,14 +10,14 @@ namespace Dashboard.ImmediateDraw
private readonly Stack<int> _zStack = new Stack<int>();
public int ZIndex => _zIndex;
private QRectangle _viewport;
private readonly Stack<QRectangle> _viewportStack = new Stack<QRectangle>();
private Rectangle _viewport;
private readonly Stack<Rectangle> _viewportStack = new Stack<Rectangle>();
private readonly Stack<Matrix4> _matrixStack = new Stack<Matrix4>();
private Command _customCommandBase = Command.CustomCommandBase;
private readonly List<CommandHandler> _customCommands = new List<CommandHandler>();
public QRectangle Viewport => _viewport;
public Rectangle Viewport => _viewport;
public Matrix4 ActiveTransforms { get; }
@@ -35,7 +35,7 @@ namespace Dashboard.ImmediateDraw
return id;
}
public void ProcessCommands(QRectangle bounds, DrawList queue)
public void ProcessCommands(Rectangle bounds, DrawList queue)
{
DrawQueue iterator = queue.GetEnumerator();
@@ -74,13 +74,13 @@ namespace Dashboard.ImmediateDraw
_viewportStack.Push(_viewport);
break;
case Command.IntersectViewport:
_viewport = QRectangle.Intersect((QRectangle)iterator.Dequeue(), _viewport);
_viewport = Rectangle.Intersect((Rectangle)iterator.Dequeue(), _viewport);
break;
case Command.StoreViewport:
_viewport = (QRectangle)iterator.Dequeue();
_viewport = (Rectangle)iterator.Dequeue();
break;
case Command.PopViewport:
_viewport = _viewportStack.TryPop(out QRectangle viewport) ? viewport : bounds;
_viewport = _viewportStack.TryPop(out Rectangle viewport) ? viewport : bounds;
break;
case Command.PushZ:
_zStack.Push(_zIndex);
@@ -123,7 +123,7 @@ namespace Dashboard.ImmediateDraw
_zIndex = 0;
_zStack.Clear();
_viewport = new QRectangle(float.MaxValue, float.MinValue, float.MinValue, float.MaxValue);
_viewport = new Rectangle(float.MaxValue, float.MinValue, float.MinValue, float.MaxValue);
_viewportStack.Clear();
_matrixStack.Clear();

View File

@@ -49,13 +49,13 @@ namespace Dashboard.ImmediateDraw
Enqueue(Command.PushViewport);
}
public void IntersectViewport(in QRectangle viewport)
public void IntersectViewport(in Rectangle viewport)
{
Enqueue(Command.IntersectViewport);
Enqueue(viewport);
}
public void StoreViewport(in QRectangle viewport)
public void StoreViewport(in Rectangle viewport)
{
Enqueue(Command.StoreViewport);
Enqueue(viewport);
@@ -126,21 +126,21 @@ namespace Dashboard.ImmediateDraw
Enqueue(Command.PopStyle);
}
public void Line(in QLine line)
public void Line(in Line line)
{
Enqueue(Command.Line);
Enqueue(line);
}
public void Line(params QLine[] lines)
public void Line(params Line[] lines)
{
Enqueue(Command.Line);
Enqueue((Frame)lines.Length);
foreach (QLine line in lines)
foreach (Line line in lines)
Enqueue(line);
}
public void Bezier(in QBezier bezier)
public void Bezier(in Bezier bezier)
{
Frame a, b;
Frame.Create(bezier, out a, out b);
@@ -150,14 +150,14 @@ namespace Dashboard.ImmediateDraw
Enqueue(b);
}
public void Bezier(params QBezier[] beziers)
public void Bezier(params Bezier[] beziers)
{
Frame a, b;
Enqueue(Command.Bezier);
Enqueue((Frame)beziers.Length);
foreach (QBezier bezier in beziers)
foreach (Bezier bezier in beziers)
{
Frame.Create(bezier, out a, out b);
Enqueue(a);
@@ -165,21 +165,21 @@ namespace Dashboard.ImmediateDraw
}
}
public void Rectangle(in QRectangle rectangle)
public void Rectangle(in Rectangle rectangle)
{
Enqueue(Command.Rectangle);
Enqueue(rectangle);
}
public void Rectangle(QRectangle[] rectangles)
public void Rectangle(Rectangle[] rectangles)
{
Enqueue(Command.Rectangle);
Enqueue((Frame)rectangles.Length);
foreach (QRectangle rectangle in rectangles)
foreach (Rectangle rectangle in rectangles)
Enqueue(rectangle);
}
public void Ellipse(in QEllipse ellipse)
public void Ellipse(in Ellipse ellipse)
{
Frame a, b;
Frame.Create(ellipse, out a, out b);
@@ -189,12 +189,12 @@ namespace Dashboard.ImmediateDraw
Enqueue(b);
}
public void Ellipse(params QEllipse[] ellipses)
public void Ellipse(params Ellipse[] ellipses)
{
Frame a, b;
Enqueue(Command.Ellipse);
Enqueue((Frame)ellipses.Length);
foreach (QEllipse ellipse in ellipses)
foreach (Ellipse ellipse in ellipses)
{
Frame.Create(ellipse, out a, out b);
Enqueue(a);
@@ -202,7 +202,7 @@ namespace Dashboard.ImmediateDraw
}
}
public void Triangle(in QTriangle triangle)
public void Triangle(in Triangle triangle)
{
Enqueue(Command.Triangle);
Enqueue(triangle.A);
@@ -210,11 +210,11 @@ namespace Dashboard.ImmediateDraw
Enqueue(triangle.C);
}
public void Triangle(params QTriangle[] triangles)
public void Triangle(params Triangle[] triangles)
{
Enqueue(Command.Triangle);
Enqueue((Frame)triangles.Length);
foreach (QTriangle triangle in triangles)
foreach (Triangle triangle in triangles)
{
Enqueue(triangle.A);
Enqueue(triangle.B);
@@ -232,7 +232,7 @@ namespace Dashboard.ImmediateDraw
}
}
public void Image(QImage texture, in QRectangle rectangle)
public void Image(Image texture, in Rectangle rectangle)
{
Enqueue(Command.Image);
Enqueue((Frame)(int)ImageCommandFlags.Single);
@@ -240,7 +240,7 @@ namespace Dashboard.ImmediateDraw
Enqueue(rectangle);
}
public void Image(QImage texture, in QRectangle rectangle, in QRectangle uv)
public void Image(Image texture, in Rectangle rectangle, in Rectangle uv)
{
Enqueue(Command.Image);
Enqueue((Frame)(int)(ImageCommandFlags.Single | ImageCommandFlags.UVs));
@@ -249,7 +249,7 @@ namespace Dashboard.ImmediateDraw
Enqueue(uv);
}
public void Image(QImage texture, ReadOnlySpan<QRectangle> rectangles, bool interleavedUV = false)
public void Image(Image texture, ReadOnlySpan<Rectangle> rectangles, bool interleavedUV = false)
{
int count = rectangles.Length;
ImageCommandFlags flags = ImageCommandFlags.None;
@@ -264,13 +264,13 @@ namespace Dashboard.ImmediateDraw
Enqueue(new Frame((int)flags, count));
Enqueue(new Frame(texture));
foreach (QRectangle rectangle in rectangles)
foreach (Rectangle rectangle in rectangles)
{
Enqueue(rectangle);
}
}
public void Image(QImage texture, ReadOnlySpan<QRectangle> rectangles, ReadOnlySpan<QRectangle> uvs)
public void Image(Image texture, ReadOnlySpan<Rectangle> rectangles, ReadOnlySpan<Rectangle> uvs)
{
int count = Math.Min(rectangles.Length, uvs.Length);
Enqueue(Command.Image);
@@ -284,7 +284,7 @@ namespace Dashboard.ImmediateDraw
}
}
public void Image3D(QImage texture, in Image3DCall call)
public void Image3D(Image texture, in Image3DCall call)
{
Enqueue(Command.Image);
Enqueue(new Frame(ImageCommandFlags.Image3d | ImageCommandFlags.Single));
@@ -294,7 +294,7 @@ namespace Dashboard.ImmediateDraw
Enqueue(new Frame(call.Layer));
}
public void Image3D(QImage texture, ReadOnlySpan<Image3DCall> calls)
public void Image3D(Image texture, ReadOnlySpan<Image3DCall> calls)
{
Enqueue(Command.Image);
Enqueue(new Frame((int)ImageCommandFlags.Image3d, calls.Length));

View File

@@ -312,29 +312,29 @@ namespace Dashboard.ImmediateDraw
}
}
public static explicit operator QRectangle(in Frame frame)
public static explicit operator Rectangle(in Frame frame)
{
switch (frame.Type)
{
default:
throw new InvalidCastException();
case FrameType.IVec4:
return new QRectangle(frame._i1, frame._i2, frame._i3, frame._i4);
return new Rectangle(frame._i1, frame._i2, frame._i3, frame._i4);
case FrameType.Vec4:
return new QRectangle(frame._f1, frame._f2, frame._f3, frame._f4);
return new Rectangle(frame._f1, frame._f2, frame._f3, frame._f4);
}
}
public static explicit operator QLine(in Frame frame)
public static explicit operator Line(in Frame frame)
{
switch (frame.Type)
{
default:
throw new InvalidCastException();
case FrameType.IVec4:
return new QLine(frame._i1, frame._i2, frame._i3, frame._i4);
return new Line(frame._i1, frame._i2, frame._i3, frame._i4);
case FrameType.Vec4:
return new QLine(frame._f1, frame._f2, frame._f3, frame._f4);
return new Line(frame._f1, frame._f2, frame._f3, frame._f4);
}
}
#endregion
@@ -344,16 +344,16 @@ namespace Dashboard.ImmediateDraw
public static implicit operator Frame(Command cmd) => new Frame(cmd);
public static implicit operator Frame(in Vector2 vector) => new Frame(vector.X, vector.Y);
public static implicit operator Frame(in Color4 color) => new Frame(color.R, color.G, color.B, color.A);
public static implicit operator Frame(in QRectangle rect) => new Frame(rect.Max.X, rect.Max.Y, rect.Min.X, rect.Min.Y);
public static implicit operator Frame(in QLine line) => new Frame(line.Start.X, line.Start.Y, line.End.X, line.Start.Y);
public static implicit operator Frame(in Rectangle rect) => new Frame(rect.Max.X, rect.Max.Y, rect.Min.X, rect.Min.Y);
public static implicit operator Frame(in Line line) => new Frame(line.Start.X, line.Start.Y, line.End.X, line.Start.Y);
public static void Create(in QBezier bezier, out Frame a, out Frame b)
public static void Create(in Bezier bezier, out Frame a, out Frame b)
{
a = new Frame(bezier.Start.X, bezier.Start.Y, bezier.End.X, bezier.End.Y);
b = new Frame(bezier.ControlA.X, bezier.ControlA.Y, bezier.ControlB.X, bezier.ControlB.Y);
}
public static void Create(in QEllipse ellipse, out Frame a, out Frame b)
public static void Create(in Ellipse ellipse, out Frame a, out Frame b)
{
a = new Frame(ellipse.Center.X, ellipse.Center.Y);
b = new Frame(ellipse.AxisA.X, ellipse.AxisA.Y, ellipse.AxisB.X, ellipse.AxisB.Y);

View File

@@ -11,8 +11,8 @@ namespace Dashboard.ImmediateDraw
public struct Image3DCall
{
public QRectangle Rectangle;
public QRectangle UVs;
public Rectangle Rectangle;
public Rectangle UVs;
public int Layer;
}
}

View File

@@ -0,0 +1,116 @@
using OpenTK.Mathematics;
using Dashboard.Controls;
using System.Reflection.Metadata;
namespace Dashboard.Layout
{
/// <summary>
/// Control attributes for grid layout.
/// </summary>
public class GridLayoutAttribute
{
/// <summary>
/// An anchor will keep the relative distance of a control's edges the same during resizes.
/// </summary>
/// <remarks><see cref="Dock"/> has higher precedence.</remarks>
public Anchor Anchor { get; set; } = Anchor.Left | Anchor.Top;
/// <summary>
/// Dock will strongly attach a control to its container or its edges.
/// </summary>
/// <remarks>Has more precedence than <see cref="Anchor"/></remarks>
public Dock Dock { get; set; } = Dock.None;
public void Evaluate(
ResizedEventArgs parentResizeEvent,
in Rectangle oldBounds,
out Rectangle newBounds
)
{
switch (Dock)
{
default:
case Dock.None:
break;
case Dock.Top:
newBounds = new Rectangle(
parentResizeEvent.NewSize.X,
oldBounds.Size.Y,
0,
0
);
return;
case Dock.Bottom:
newBounds = new Rectangle(
parentResizeEvent.NewSize.X,
parentResizeEvent.NewSize.Y,
0,
oldBounds.Size.Y
);
return;
case Dock.Left:
newBounds = new Rectangle(
oldBounds.Size.X,
parentResizeEvent.NewSize.Y,
0,
0
);
return;
case Dock.Right:
newBounds = new Rectangle(
parentResizeEvent.NewSize.X,
parentResizeEvent.NewSize.Y,
parentResizeEvent.NewSize.Y - oldBounds.Size.Y,
0
);
return;
}
Vector2 scale = parentResizeEvent.NewSize / parentResizeEvent.OldSize;
newBounds = oldBounds;
if (Anchor.HasFlag(Anchor.Top))
{
newBounds.Top = scale.Y * oldBounds.Top;
}
if (Anchor.HasFlag(Anchor.Left))
{
newBounds.Left = scale.X * oldBounds.Left;
}
if (Anchor.HasFlag(Anchor.Bottom))
{
float margin = scale.Y * (parentResizeEvent.OldSize.Y - newBounds.Bottom);
newBounds.Bottom = parentResizeEvent.NewSize.Y - margin;
}
if (Anchor.HasFlag(Anchor.Right))
{
float margin = scale.X * (parentResizeEvent.OldSize.X - newBounds.Right);
newBounds.Right = parentResizeEvent.NewSize.X - margin;
}
}
/// <summary>
/// Get the grid layout attribute associated with the given UI-base.
/// </summary>
/// <param name="uiBase">The UI-base to query.</param>
/// <returns>It's grid layout attribute, if any.</returns>
public static GridLayoutAttribute GetGridLayout(UIBase uiBase)
{
const string GRID_LAYOUT_ATTRIBUTE_KEY = "486ddf8c-b75f-4ad4-a51d-5ba20db9bd0e";
if (
!uiBase.Attributes.TryGetValue(GRID_LAYOUT_ATTRIBUTE_KEY, out object? attribute)
|| attribute is not GridLayoutAttribute)
{
attribute = new GridLayoutAttribute();
uiBase.Attributes[GRID_LAYOUT_ATTRIBUTE_KEY] = attribute;
}
return (GridLayoutAttribute)attribute;
}
}
}

View File

@@ -9,12 +9,12 @@ namespace Dashboard.Media.Color
{
switch (image.Format)
{
case QImageFormat.RaF:
case QImageFormat.RaU8:
case QImageFormat.RgbF:
case QImageFormat.RgbU8:
case QImageFormat.RgbaF:
case QImageFormat.RgbaU8:
case ImageFormat.RaF:
case ImageFormat.RaU8:
case ImageFormat.RgbF:
case ImageFormat.RgbU8:
case ImageFormat.RgbaF:
case ImageFormat.RgbaU8:
break;
default:
return;

View File

@@ -3,19 +3,19 @@ using System.Runtime.InteropServices;
namespace Dashboard.Media.Color
{
public class QImageBuffer : QImage
public class QImageBuffer : Image
{
private byte[] buffer;
GCHandle handle;
private bool isSdf = false;
public override QImageFormat InternalFormat { get; }
public override ImageFormat InternalFormat { get; }
public override int Width { get; }
public override int Height { get; }
public override int Depth { get; }
public override bool IsSdf => isSdf;
public QImageBuffer(QImageFormat format, int width, int height, int depth = 1)
public QImageBuffer(ImageFormat format, int width, int height, int depth = 1)
{
InternalFormat = format;
Width = width;

View File

@@ -9,7 +9,7 @@ namespace Dashboard.Media.Color
public int Width => Lock.Width;
public int Height => Lock.Height;
public int Depth => Depth;
public QImageFormat Format => Lock.Format;
public ImageFormat Format => Lock.Format;
public LockIO(QImageLock imageLock)
{
@@ -29,11 +29,11 @@ namespace Dashboard.Media.Color
switch (Format)
{
default:
case QImageFormat.RedU8: return new Color4(ptr[0], 0, 0, 255);
case QImageFormat.AlphaU8: return new Color4(0, 0, 0, ptr[0]);
case QImageFormat.RaU8: return new Color4(ptr[0], 0, 0, ptr[1]);
case QImageFormat.RgbU8: return new Color4(ptr[0], ptr[1], ptr[2], 255);
case QImageFormat.RgbaU8: return new Color4(ptr[0], ptr[1], ptr[2], ptr[3]);
case ImageFormat.RedU8: return new Color4(ptr[0], 0, 0, 255);
case ImageFormat.AlphaU8: return new Color4(0, 0, 0, ptr[0]);
case ImageFormat.RaU8: return new Color4(ptr[0], 0, 0, ptr[1]);
case ImageFormat.RgbU8: return new Color4(ptr[0], ptr[1], ptr[2], 255);
case ImageFormat.RgbaU8: return new Color4(ptr[0], ptr[1], ptr[2], ptr[3]);
}
}
@@ -45,22 +45,22 @@ namespace Dashboard.Media.Color
switch (Format)
{
default:
case QImageFormat.RedU8:
case ImageFormat.RedU8:
ptr[0] = (byte)(value.R * 255);
break;
case QImageFormat.AlphaU8:
case ImageFormat.AlphaU8:
ptr[0] = (byte)(value.A * 255);
break;
case QImageFormat.RaU8:
case ImageFormat.RaU8:
ptr[0] = (byte)(value.R * 255);
ptr[1] = (byte)(value.A * 255);
break;
case QImageFormat.RgbU8:
case ImageFormat.RgbU8:
ptr[0] = (byte)(value.R * 255);
ptr[1] = (byte)(value.G * 255);
ptr[2] = (byte)(value.B * 255);
break;
case QImageFormat.RgbaU8:
case ImageFormat.RgbaU8:
ptr[0] = (byte)(value.R * 255);
ptr[1] = (byte)(value.G * 255);
ptr[2] = (byte)(value.B * 255);
@@ -82,7 +82,7 @@ namespace Dashboard.Media.Color
public int Width => Lock.Width;
public int Height => Lock.Height;
public int Depth => Depth;
public QImageFormat Format => Lock.Format;
public ImageFormat Format => Lock.Format;
public LockIOF(QImageLock imageLock)
{
@@ -102,11 +102,11 @@ namespace Dashboard.Media.Color
switch (Format)
{
default:
case QImageFormat.RedU8: return new Color4(ptr[0], 0, 0, 1);
case QImageFormat.AlphaU8: return new Color4(0, 0, 0, ptr[0]);
case QImageFormat.RaU8: return new Color4(ptr[0], 0, 0, ptr[1]);
case QImageFormat.RgbU8: return new Color4(ptr[0], ptr[1], ptr[2], 1);
case QImageFormat.RgbaU8: return new Color4(ptr[0], ptr[1], ptr[2], ptr[3]);
case ImageFormat.RedU8: return new Color4(ptr[0], 0, 0, 1);
case ImageFormat.AlphaU8: return new Color4(0, 0, 0, ptr[0]);
case ImageFormat.RaU8: return new Color4(ptr[0], 0, 0, ptr[1]);
case ImageFormat.RgbU8: return new Color4(ptr[0], ptr[1], ptr[2], 1);
case ImageFormat.RgbaU8: return new Color4(ptr[0], ptr[1], ptr[2], ptr[3]);
}
}
@@ -118,22 +118,22 @@ namespace Dashboard.Media.Color
switch (Format)
{
default:
case QImageFormat.RedU8:
case ImageFormat.RedU8:
ptr[0] = value.R;
break;
case QImageFormat.AlphaU8:
case ImageFormat.AlphaU8:
ptr[0] = value.A;
break;
case QImageFormat.RaU8:
case ImageFormat.RaU8:
ptr[0] = value.R;
ptr[1] = value.A;
break;
case QImageFormat.RgbU8:
case ImageFormat.RgbU8:
ptr[0] = value.R;
ptr[1] = value.G;
ptr[2] = value.B;
break;
case QImageFormat.RgbaU8:
case ImageFormat.RgbaU8:
ptr[0] = value.R;
ptr[1] = value.G;
ptr[2] = value.B;

View File

@@ -2,68 +2,68 @@ namespace Dashboard.Media
{
public static class Extensions
{
public static bool IsU8(this QImageFormat format)
public static bool IsU8(this ImageFormat format)
{
switch (format)
{
case QImageFormat.AlphaU8:
case QImageFormat.RedU8:
case QImageFormat.RaU8:
case QImageFormat.RgbU8:
case QImageFormat.RgbaU8:
case ImageFormat.AlphaU8:
case ImageFormat.RedU8:
case ImageFormat.RaU8:
case ImageFormat.RgbU8:
case ImageFormat.RgbaU8:
return true;
default:
return false;
}
}
public static bool IsFloat(this QImageFormat format)
public static bool IsFloat(this ImageFormat format)
{
switch (format)
{
case QImageFormat.AlphaF:
case QImageFormat.RedF:
case QImageFormat.RaF:
case QImageFormat.RgbF:
case QImageFormat.RgbaF:
case ImageFormat.AlphaF:
case ImageFormat.RedF:
case ImageFormat.RaF:
case ImageFormat.RgbF:
case ImageFormat.RgbaF:
return true;
default:
return false;
}
}
public static int BytesPerPixel(this QImageFormat format)
public static int BytesPerPixel(this ImageFormat format)
{
switch (format)
{
case QImageFormat.AlphaU8: return sizeof(byte);
case QImageFormat.RedU8: return sizeof(byte);
case QImageFormat.RaU8: return 2 * sizeof(byte);
case QImageFormat.RgbU8: return 3 * sizeof(byte);
case QImageFormat.RgbaU8: return 4 * sizeof(byte);
case QImageFormat.AlphaF: return sizeof(float);
case QImageFormat.RedF: return sizeof(float);
case QImageFormat.RaF: return 2 * sizeof(float);
case QImageFormat.RgbF: return 3 * sizeof(float);
case QImageFormat.RgbaF: return 4 * sizeof(float);
case ImageFormat.AlphaU8: return sizeof(byte);
case ImageFormat.RedU8: return sizeof(byte);
case ImageFormat.RaU8: return 2 * sizeof(byte);
case ImageFormat.RgbU8: return 3 * sizeof(byte);
case ImageFormat.RgbaU8: return 4 * sizeof(byte);
case ImageFormat.AlphaF: return sizeof(float);
case ImageFormat.RedF: return sizeof(float);
case ImageFormat.RaF: return 2 * sizeof(float);
case ImageFormat.RgbF: return 3 * sizeof(float);
case ImageFormat.RgbaF: return 4 * sizeof(float);
default: return 0;
}
}
public static int Channels(this QImageFormat format)
public static int Channels(this ImageFormat format)
{
switch (format)
{
case QImageFormat.AlphaU8: return 1;
case QImageFormat.RedU8: return 1;
case QImageFormat.RaU8: return 2;
case QImageFormat.RgbU8: return 3;
case QImageFormat.RgbaU8: return 4;
case QImageFormat.AlphaF: return 1;
case QImageFormat.RedF: return 1;
case QImageFormat.RaF: return 2;
case QImageFormat.RgbF: return 3;
case QImageFormat.RgbaF: return 4;
case ImageFormat.AlphaU8: return 1;
case ImageFormat.RedU8: return 1;
case ImageFormat.RaU8: return 2;
case ImageFormat.RgbU8: return 3;
case ImageFormat.RgbaU8: return 4;
case ImageFormat.AlphaF: return 1;
case ImageFormat.RedF: return 1;
case ImageFormat.RaF: return 2;
case ImageFormat.RgbF: return 3;
case ImageFormat.RgbaF: return 4;
default: return 0;
}
}

View File

@@ -2,14 +2,14 @@ using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using Dashboard.Media;
using Dashboard.Media.Font;
using Dashboard.Media.Fonts;
namespace Dashboard.Media
{
/// <summary>
/// Abstract class that represents a font.
/// </summary>
public abstract class QFont : IDisposable
public abstract class Font : IDisposable
{
public abstract FontFace Face { get; }
public string Family => Face.Family;
@@ -18,7 +18,7 @@ namespace Dashboard.Media
public FontStretch Stretch => Face.Stretch;
public abstract bool HasRune(int rune);
protected abstract QImage Render(out QGlyphMetrics metrics, int codepoint, float size, in FontRasterizerOptions options);
protected abstract Image Render(out GlyphMetrics metrics, int codepoint, float size, in FontRasterizerOptions options);
private readonly Dictionary<float, SizedFontCollection> _atlasses = new Dictionary<float, SizedFontCollection>();
@@ -69,13 +69,13 @@ namespace Dashboard.Media
atlas = new FontAtlas(width, height, DbApplication.Current.FontProvider.RasterizerOptions.Sdf);
}
public void Get(int codepoint, out FontGlyph glyph, QFont font)
public void Get(int codepoint, out FontGlyph glyph, Font font)
{
if (glyphs.TryGetValue(codepoint, out glyph))
return;
QImage image = font.Render(
out QGlyphMetrics metrics,
Image image = font.Render(
out GlyphMetrics metrics,
codepoint,
Size,
DbApplication.Current.FontProvider.RasterizerOptions);
@@ -102,11 +102,11 @@ namespace Dashboard.Media
public readonly struct FontGlyph
{
public readonly int CodePoint;
public readonly QImage? Image;
public readonly QGlyphMetrics Metrics;
public readonly QRectangle UVs;
public readonly Image? Image;
public readonly GlyphMetrics Metrics;
public readonly Rectangle UVs;
public FontGlyph(int codepoint, QImage? image, in QGlyphMetrics metrics, in QRectangle uvs)
public FontGlyph(int codepoint, Image? image, in GlyphMetrics metrics, in Rectangle uvs)
{
CodePoint = codepoint;
Image = image;

View File

@@ -3,13 +3,13 @@ using System.Collections.Generic;
using Dashboard.Media.Color;
using OpenTK.Mathematics;
namespace Dashboard.Media.Font
namespace Dashboard.Media.Fonts
{
public struct FontAtlasGlyphInfo
{
public int Codepoint;
public QImage Image;
public QRectangle UVs;
public Image Image;
public Rectangle UVs;
}
public class FontAtlas
@@ -109,7 +109,7 @@ namespace Dashboard.Media.Font
private class AtlasPage : IDisposable
{
public QImage Image;
public Image Image;
public int PointerX, PointerY;
public int RowHeight;
public int Expansion;
@@ -118,7 +118,7 @@ namespace Dashboard.Media.Font
public AtlasPage(int width, int height, int expansion)
{
Image = new QImageBuffer(QImageFormat.AlphaU8, width, height);
Image = new QImageBuffer(ImageFormat.AlphaU8, width, height);
Expansion = expansion;
Reset();
}
@@ -136,7 +136,7 @@ namespace Dashboard.Media.Font
Vector2 size = new Vector2((float)src.Width/Image.Width, (float)src.Height/Image.Height);
prototype.Image = Image;
prototype.UVs = new QRectangle(min + size, min);
prototype.UVs = new Rectangle(min + size, min);
AdvanceColumn(src.Width, src.Height);
}

View File

@@ -1,7 +1,7 @@
using System;
using System.Text;
namespace Dashboard.Media.Font
namespace Dashboard.Media.Fonts
{
public readonly struct FontFace : IEquatable<FontFace>
{

View File

@@ -1,4 +1,4 @@
namespace Dashboard.Media.Font
namespace Dashboard.Media.Fonts
{
public enum FontSlant
{

View File

@@ -1,4 +1,4 @@
namespace Dashboard.Media.Font
namespace Dashboard.Media.Fonts
{
/// <summary>
/// Enumeration of font stretch values.

View File

@@ -1,6 +1,6 @@
using System;
namespace Dashboard.Media.Font
namespace Dashboard.Media.Fonts
{
public enum FontWeight
{

View File

@@ -1,4 +1,4 @@
namespace Dashboard.Media.Font
namespace Dashboard.Media.Fonts
{
public enum SystemFontFamily
{

View File

@@ -5,7 +5,7 @@ namespace Dashboard.Media
/// <summary>
/// Glyph properties with metrics based on FreeType glyph metrics.
/// </summary>
public struct QGlyphMetrics
public struct GlyphMetrics
{
/// <summary>
/// The code point for the character.
@@ -32,7 +32,7 @@ namespace Dashboard.Media
/// </summary>
public Vector2 Advance { get; }
public QGlyphMetrics(
public GlyphMetrics(
int character,
Vector2 size,
Vector2 horizontalBearing,

View File

@@ -1,12 +1,12 @@
using System;
namespace Dashboard.Media
{
public abstract class QImage : IDisposable
public abstract class Image : IDisposable
{
public abstract int Width { get; }
public abstract int Height { get; }
public abstract int Depth { get; }
public abstract QImageFormat InternalFormat { get; }
public abstract ImageFormat InternalFormat { get; }
public virtual int MipMapLevels => 0;
public virtual bool Premultiplied => false;
public virtual bool IsSdf => false;
@@ -32,12 +32,12 @@ namespace Dashboard.Media
public struct QImageLockOptions
{
public QImageFormat Format { get; }
public ImageFormat Format { get; }
public bool Premultiply { get; }
public int MipLevel { get; }
public static QImageLockOptions Default { get; } = new QImageLockOptions(QImageFormat.RgbaU8, true, 0);
public static QImageLockOptions Default { get; } = new QImageLockOptions(ImageFormat.RgbaU8, true, 0);
public QImageLockOptions(QImageFormat format, bool premultiply, int level)
public QImageLockOptions(ImageFormat format, bool premultiply, int level)
{
Format = format;
Premultiply = premultiply;
@@ -47,13 +47,13 @@ namespace Dashboard.Media
public struct QImageLock
{
public QImageFormat Format { get; }
public ImageFormat Format { get; }
public int Width { get; }
public int Height { get; }
public int Depth { get; }
public IntPtr ImagePtr { get; }
public QImageLock(QImageFormat format, int width, int height, int depth, IntPtr ptr)
public QImageLock(ImageFormat format, int width, int height, int depth, IntPtr ptr)
{
Format = format;
Width = width;

View File

@@ -2,7 +2,7 @@ using System;
namespace Dashboard.Media
{
public enum QImageFormat
public enum ImageFormat
{
Undefined,
RedU8,

View File

@@ -87,7 +87,7 @@ namespace Dashboard.OpenGL
if (!IsInit) throw new InvalidOperationException("Initialize the driver first.");
}
public void Draw(DrawCallQueue queue, in QRectangle view)
public void Draw(DrawCallQueue queue, in Rectangle view)
{
AssertInit();
@@ -331,15 +331,15 @@ namespace Dashboard.OpenGL
internal class TextureManager : IDisposable
{
private readonly Dictionary<QImage, int> textures = new Dictionary<QImage, int>();
private readonly HashSet<QImage> imagesNotUsed = new HashSet<QImage>();
private readonly Dictionary<Image, int> textures = new Dictionary<Image, int>();
private readonly HashSet<Image> imagesNotUsed = new HashSet<Image>();
private bool isDisposed = false;
public void BeginFrame()
{
if (imagesNotUsed.Count > 0)
{
foreach (QImage image in imagesNotUsed)
foreach (Image image in imagesNotUsed)
{
GL.DeleteTexture(textures[image]);
}
@@ -347,13 +347,13 @@ namespace Dashboard.OpenGL
imagesNotUsed.Clear();
}
foreach (QImage image in textures.Keys)
foreach (Image image in textures.Keys)
{
imagesNotUsed.Add(image);
}
}
public int GetTexture(QImage image)
public int GetTexture(Image image)
{
if (textures.TryGetValue(image, out int texture))
{
@@ -372,7 +372,7 @@ namespace Dashboard.OpenGL
return textures[image] = texture;
}
public int UploadTexture3d(QImage image3d)
public int UploadTexture3d(Image image3d)
{
int texture = GL.GenTexture();
@@ -388,7 +388,7 @@ namespace Dashboard.OpenGL
return texture;
}
public int UploadTexture2d(QImage image2d)
public int UploadTexture2d(Image image2d)
{
int texture = GL.GenTexture();
@@ -403,15 +403,15 @@ namespace Dashboard.OpenGL
switch (image2d.InternalFormat)
{
case QImageFormat.RedU8:
case QImageFormat.RedF:
case ImageFormat.RedU8:
case ImageFormat.RedF:
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureSwizzleR, (int)All.Red);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureSwizzleG, (int)All.Red);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureSwizzleB, (int)All.Red);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureSwizzleA, (int)All.One);
break;
case QImageFormat.AlphaU8:
case QImageFormat.AlphaF:
case ImageFormat.AlphaU8:
case ImageFormat.AlphaF:
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureSwizzleR, (int)All.One);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureSwizzleG, (int)All.One);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureSwizzleB, (int)All.One);
@@ -433,28 +433,28 @@ namespace Dashboard.OpenGL
GL.DeleteTextures(ids.Length, ref ids[0]);
}
private static readonly Dictionary<QImageFormat, PixelFormat> s_InternalFormat = new Dictionary<QImageFormat, PixelFormat>()
private static readonly Dictionary<ImageFormat, PixelFormat> s_InternalFormat = new Dictionary<ImageFormat, PixelFormat>()
{
[QImageFormat.AlphaF] = PixelFormat.Alpha,
[QImageFormat.AlphaU8] = PixelFormat.Alpha,
[QImageFormat.RedF] = PixelFormat.Red,
[QImageFormat.RedU8] = PixelFormat.Red,
[QImageFormat.RgbF] = PixelFormat.Rgb,
[QImageFormat.RgbU8] = PixelFormat.Rgb,
[QImageFormat.RgbaU8] = PixelFormat.Rgba,
[QImageFormat.RgbaF] = PixelFormat.Rgba,
[ImageFormat.AlphaF] = PixelFormat.Alpha,
[ImageFormat.AlphaU8] = PixelFormat.Alpha,
[ImageFormat.RedF] = PixelFormat.Red,
[ImageFormat.RedU8] = PixelFormat.Red,
[ImageFormat.RgbF] = PixelFormat.Rgb,
[ImageFormat.RgbU8] = PixelFormat.Rgb,
[ImageFormat.RgbaU8] = PixelFormat.Rgba,
[ImageFormat.RgbaF] = PixelFormat.Rgba,
};
private static readonly Dictionary<QImageFormat, PixelType> s_PixelType = new Dictionary<QImageFormat, PixelType>()
private static readonly Dictionary<ImageFormat, PixelType> s_PixelType = new Dictionary<ImageFormat, PixelType>()
{
[QImageFormat.AlphaF] = PixelType.Float,
[QImageFormat.RedF] = PixelType.Float,
[QImageFormat.RgbF] = PixelType.Float,
[QImageFormat.RgbaF] = PixelType.Float,
[QImageFormat.AlphaU8] = PixelType.UnsignedByte,
[QImageFormat.RedU8] = PixelType.UnsignedByte,
[QImageFormat.RgbU8] = PixelType.UnsignedByte,
[QImageFormat.RgbaU8] = PixelType.UnsignedByte,
[ImageFormat.AlphaF] = PixelType.Float,
[ImageFormat.RedF] = PixelType.Float,
[ImageFormat.RgbF] = PixelType.Float,
[ImageFormat.RgbaF] = PixelType.Float,
[ImageFormat.AlphaU8] = PixelType.UnsignedByte,
[ImageFormat.RedU8] = PixelType.UnsignedByte,
[ImageFormat.RgbU8] = PixelType.UnsignedByte,
[ImageFormat.RgbaU8] = PixelType.UnsignedByte,
};
}
}

View File

@@ -1,11 +1,7 @@
using OpenTK.Mathematics;
using Dashboard.ImmediateDraw;
using Dashboard.ImmediateDraw;
using Dashboard.Controls;
using OpenTK.Mathematics;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Dashboard.PAL
{
@@ -15,7 +11,7 @@ namespace Dashboard.PAL
public class Dash
{
private readonly IDashHandle handle;
private readonly IDashboardPlatform platform;
private readonly IDbPlatform platform;
public string Title
{
@@ -51,7 +47,7 @@ namespace Dashboard.PAL
}
}
public Dash(IDashboardPlatform platform)
public Dash(IDbPlatform platform)
{
this.platform = platform;
handle = platform.CreatePort();
@@ -79,7 +75,7 @@ namespace Dashboard.PAL
list ??= new DrawList();
list.Clear();
UIElement.Bounds = new QRectangle(Size, new Vector2(0,0));
UIElement.Bounds = new Rectangle(Size, new Vector2(0,0));
UIElement.Paint(list);
platform.PortPaint(handle, list);
}

View File

@@ -15,7 +15,7 @@ namespace Dashboard.PAL
/// <summary>
/// The primary primary platform abstraction interface for dashboard hosts.
/// </summary>
public interface IDashboardPlatform : IDisposable
public interface IDbPlatform : IDisposable
{
/// <summary>
/// The title of the application.
@@ -25,7 +25,7 @@ namespace Dashboard.PAL
/// <summary>
/// The default icon for the application.
/// </summary>
QImage? Icon { get; set; }
Image? Icon { get; set; }
/// <summary>
/// The event raised when an event is received.

View File

@@ -1,7 +1,7 @@
using System;
using System.Collections.Generic;
using System.IO;
using Dashboard.Media.Font;
using Dashboard.Media.Fonts;
namespace Dashboard.PAL
{

View File

@@ -7,6 +7,6 @@ namespace Dashboard.PAL
{
public interface IFontFactory
{
bool TryOpen(Stream stream, [NotNullWhen(true)] out QFont font);
bool TryOpen(Stream stream, [NotNullWhen(true)] out Font font);
}
}

View File

@@ -1,7 +1,7 @@
using System;
using System.Collections.Generic;
using Dashboard.Media;
using Dashboard.Media.Font;
using Dashboard.Media.Fonts;
using OpenTK.Mathematics;
namespace Dashboard
@@ -110,9 +110,9 @@ namespace Dashboard
set => this["list-marker-position"] = value;
}
public QImage? ListMarkerImage
public Image? ListMarkerImage
{
get => (QImage?)this["list-marker-image"];
get => (Image?)this["list-marker-image"];
set => this["list-marker-image"] = value;
}
@@ -209,7 +209,7 @@ namespace Dashboard
/// <summary>
/// A line stipple pattern.
/// </summary>
public struct QuikStipplePattern
public struct StipplePattern
{
/// <summary>
/// The stipple pitch value.
@@ -221,19 +221,19 @@ namespace Dashboard
/// </summary>
public float DutyCycle;
public QuikStipplePattern(float pitch, float dutyCycle)
public StipplePattern(float pitch, float dutyCycle)
{
Pitch = pitch;
DutyCycle = dutyCycle;
}
public static QuikStipplePattern None => new QuikStipplePattern(0.0f, 1.0f);
public static StipplePattern None => new StipplePattern(0.0f, 1.0f);
}
/// <summary>
/// Stroke style for lines and borders.
/// </summary>
public class QuikStrokeStyle
public class StrokeStyle
{
/// <summary>
/// Stroke color.
@@ -250,11 +250,11 @@ namespace Dashboard
// /// </summary>
// public QuikStipplePattern StipplePattern { get; set; }
public QuikStrokeStyle()
public StrokeStyle()
{
}
public QuikStrokeStyle(Color4 color, float width /*, QuikStipplePattern pattern*/)
public StrokeStyle(Color4 color, float width /*, QuikStipplePattern pattern*/)
{
Color = color;
Width = width;
@@ -269,7 +269,7 @@ namespace Dashboard
/// <summary>
/// Fill style for rectangles and the like.
/// </summary>
public class QuikFillStyle
public class FillStyle
{
public Color4 Color { get; set; }
}

View File

@@ -1,5 +1,5 @@
using Dashboard.Media;
using Dashboard.Media.Font;
using Dashboard.Media.Fonts;
using Dashboard.PAL;
using System;
using System.Collections.Generic;
@@ -13,18 +13,18 @@ namespace Dashboard.Typography
/// </summary>
public class FontProvider : IDisposable
{
private Dictionary<FontFace, QFont> Fonts { get; } = new Dictionary<FontFace, QFont>();
private HashSet<QFont> UsedFonts { get; } = new HashSet<QFont>();
private Dictionary<FontFace, Font> Fonts { get; } = new Dictionary<FontFace, Font>();
private HashSet<Font> UsedFonts { get; } = new HashSet<Font>();
public readonly FontRasterizerOptions RasterizerOptions;
public IFontDataBase? Database { get; set; }
public IFontFactory? FontFactory { get; set; }
private readonly DbApplication App;
public QFont this[FontFace info]
public Font this[FontFace info]
{
get
{
if (!Fonts.TryGetValue(info, out QFont? font))
if (!Fonts.TryGetValue(info, out Font? font))
{
using Stream str = Database?.Open(info) ?? throw new Exception("Font could not be found.");
@@ -43,7 +43,7 @@ namespace Dashboard.Typography
}
}
public QFont this[SystemFontFamily family]
public Font this[SystemFontFamily family]
{
get
{
@@ -99,7 +99,7 @@ namespace Dashboard.Typography
if (isDisposed) return;
isDisposed = true;
foreach (QFont font in Fonts.Values)
foreach (Font font in Fonts.Values)
{
font.Dispose();
}

View File

@@ -227,7 +227,7 @@ namespace Dashboard.Typography
pen.Y -= PostSpace;
group.BoundingBox = new QRectangle(width, pen.Y, 0, 0);
group.BoundingBox = new Rectangle(width, pen.Y, 0, 0);
group.Translate(-pen);
}
@@ -354,15 +354,15 @@ namespace Dashboard.Typography
public struct TypesetCharacter
{
public int Character;
public QImage Texture;
public QRectangle Position;
public QRectangle UV;
public Image Texture;
public Rectangle Position;
public Rectangle UV;
public TypesetCharacter(
int chr,
QImage texture,
in QRectangle position,
in QRectangle uv)
Image texture,
in Rectangle position,
in Rectangle uv)
{
Character = chr;
Texture = texture;
@@ -376,7 +376,7 @@ namespace Dashboard.Typography
private int _count = 0;
private TypesetCharacter[] _array = Array.Empty<TypesetCharacter>();
public QRectangle BoundingBox;
public Rectangle BoundingBox;
public int Count => _count;

View File

@@ -75,7 +75,7 @@ namespace Dashboard.Typography
}
}
public static Vector2 MeasureHorizontal(ReadOnlySpan<char> str, float size, QFont font)
public static Vector2 MeasureHorizontal(ReadOnlySpan<char> str, float size, Font font)
{
var enumerator = new LineEnumerator(str);
@@ -103,9 +103,9 @@ namespace Dashboard.Typography
return new Vector2(width, height);
}
public static void TypesetHorizontalDirect(this DrawList list, ReadOnlySpan<char> str, Vector2 origin, float size, QFont font)
public static void TypesetHorizontalDirect(this DrawList list, ReadOnlySpan<char> str, Vector2 origin, float size, Font font)
{
Dictionary<QImage, FontDrawInfo> drawInfo = new Dictionary<QImage, FontDrawInfo>();
Dictionary<Image, FontDrawInfo> drawInfo = new Dictionary<Image, FontDrawInfo>();
var enumerator = new LineEnumerator(str);
Vector2 pen = origin;
@@ -135,8 +135,8 @@ namespace Dashboard.Typography
int codepoint = r.Value;
font.Get(codepoint, size, out FontGlyph glyph);
ref readonly QGlyphMetrics metrics = ref glyph.Metrics;
QImage? image = glyph.Image;
ref readonly GlyphMetrics metrics = ref glyph.Metrics;
Image? image = glyph.Image;
if (image == null)
{
@@ -148,11 +148,11 @@ namespace Dashboard.Typography
{
info = new FontDrawInfo();
info.Image = image;
info.rectangles = new List<QRectangle>();
info.rectangles = new List<Rectangle>();
drawInfo[image] = info;
}
QRectangle dest = new QRectangle(
Rectangle dest = new Rectangle(
pen + new Vector2(metrics.HorizontalBearing.X + metrics.Size.X, metrics.Size.Y - metrics.HorizontalBearing.Y),
pen + new Vector2(metrics.HorizontalBearing.X, -metrics.HorizontalBearing.Y));
@@ -175,8 +175,8 @@ namespace Dashboard.Typography
private struct FontDrawInfo
{
public QImage Image;
public List<QRectangle> rectangles;
public Image Image;
public List<Rectangle> rectangles;
}
}
}

View File

@@ -13,8 +13,8 @@ namespace Dashboard.VertexGenerator
private readonly List<DrawCall> _drawCalls = new List<DrawCall>();
private int _start;
private int _baseOffset;
private QRectangle _bounds;
private QImage? _texture;
private Rectangle _bounds;
private Image? _texture;
public int ZDepth { get; private set; }
public DbVertex[] VertexArray => _vertices.InternalArray;
@@ -33,7 +33,7 @@ namespace Dashboard.VertexGenerator
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void StartDrawCall(in QRectangle bounds, QImage? texture, int baseOffset)
public void StartDrawCall(in Rectangle bounds, Image? texture, int baseOffset)
{
_start = ElementCount;
_texture = texture;
@@ -42,13 +42,13 @@ namespace Dashboard.VertexGenerator
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void StartDrawCall(in QRectangle bounds) => StartDrawCall(bounds, null, _vertices.Count);
public void StartDrawCall(in Rectangle bounds) => StartDrawCall(bounds, null, _vertices.Count);
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void StartDrawCall(in QRectangle bounds, int baseOffset) => StartDrawCall(bounds, null, baseOffset);
public void StartDrawCall(in Rectangle bounds, int baseOffset) => StartDrawCall(bounds, null, baseOffset);
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void StartDrawCall(in QRectangle bounds, QImage texture) => StartDrawCall(bounds, texture, _vertices.Count);
public void StartDrawCall(in Rectangle bounds, Image texture) => StartDrawCall(bounds, texture, _vertices.Count);
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void AddVertex(in DbVertex vertex)
@@ -99,10 +99,10 @@ namespace Dashboard.VertexGenerator
{
public int Start { get; }
public int Count { get; }
public QRectangle Bounds { get; }
public QImage? Texture { get; }
public Rectangle Bounds { get; }
public Image? Texture { get; }
public DrawCall(int start, int count, in QRectangle bounds, QImage? texture)
public DrawCall(int start, int count, in Rectangle bounds, Image? texture)
{
Start = start;
Count = count;

View File

@@ -66,7 +66,7 @@ namespace Dashboard.VertexGenerator
return (int) Math.Ceiling(arc * radius * CurveGranularity);
}
private readonly List<QLine> LineList = new List<QLine>();
private readonly List<Line> LineList = new List<Line>();
private void LineProc(DrawQueue queue)
{
Frame frame = queue.Dequeue();
@@ -79,12 +79,12 @@ namespace Dashboard.VertexGenerator
for (int i = 0; i < count; i++)
{
frame = queue.Dequeue();
LineList.Add((QLine)frame);
LineList.Add((Line)frame);
}
}
else
{
LineList.Add((QLine)frame);
LineList.Add((Line)frame);
}
float width = Style.StrokeWidth ?? 1;
@@ -93,7 +93,7 @@ namespace Dashboard.VertexGenerator
LineInfo prevBase, nextBase = default;
for (int i = 0; i < LineList.Count; i++)
{
QLine line = LineList[i];
Line line = LineList[i];
// A line segment needs a start cap if it is the first segment in
// the list, or the last end point is not the current start point.
bool isStart = (i == 0 || line.Start != LineList[i - 1].End);
@@ -124,7 +124,7 @@ namespace Dashboard.VertexGenerator
DrawQueue.EndDrawCall();
}
private LineInfo GenerateLineSegment(in QLine line)
private LineInfo GenerateLineSegment(in Line line)
{
DbVertex vertex = StrokeVertex;
DbVertex a, b, c, d;
@@ -291,7 +291,7 @@ namespace Dashboard.VertexGenerator
}
}
private readonly List<QBezier> BezierList = new List<QBezier>();
private readonly List<Bezier> BezierList = new List<Bezier>();
private void BezierProc(DrawQueue queue)
{
Frame a = queue.Dequeue();
@@ -308,7 +308,7 @@ namespace Dashboard.VertexGenerator
b = queue.Dequeue();
BezierList.Add(
new QBezier(
new Bezier(
new Vector2(a.GetF(0), a.GetF(1)),
new Vector2(b.GetF(0), b.GetF(1)),
new Vector2(b.GetF(2), b.GetF(3)),
@@ -322,7 +322,7 @@ namespace Dashboard.VertexGenerator
b = queue.Dequeue();
BezierList.Add(
new QBezier(
new Bezier(
new Vector2(a.GetF(0), a.GetF(1)),
new Vector2(b.GetF(0), b.GetF(1)),
new Vector2(b.GetF(2), b.GetF(3)),
@@ -337,7 +337,7 @@ namespace Dashboard.VertexGenerator
LineInfo prevBase, nextBase = default;
for (int i = 0; i < LineList.Count; i++)
{
QBezier bezier = BezierList[i];
Bezier bezier = BezierList[i];
// A line segment needs a start cap if it is the first segment in
// the list, or the last end point is not the current start point.
bool isStart = (i == 0 || bezier.Start != BezierList[i - 1].End);
@@ -368,7 +368,7 @@ namespace Dashboard.VertexGenerator
DrawQueue.EndDrawCall();
}
private LineInfo GenerateBezierSegment(in QBezier bezier)
private LineInfo GenerateBezierSegment(in Bezier bezier)
{
Vector2 startTangent = bezier.GetBezierTangent(0);
Vector2 endTangent = bezier.GetBezierTangent(1);
@@ -408,7 +408,7 @@ namespace Dashboard.VertexGenerator
return new LineInfo(vbase, 0, 1, index - 2, index - 1);
}
private readonly List<QRectangle> RectangleList = new List<QRectangle>();
private readonly List<Rectangle> RectangleList = new List<Rectangle>();
private void RectangleProc(DrawQueue queue)
{
Frame frame = queue.Dequeue();
@@ -419,12 +419,12 @@ namespace Dashboard.VertexGenerator
for (int i = 0; i < count; i++)
{
frame = queue.Dequeue();
RectangleList.Add((QRectangle)frame);
RectangleList.Add((Rectangle)frame);
}
}
else
{
RectangleList.Add((QRectangle)frame);
RectangleList.Add((Rectangle)frame);
}
float stroke = Style.StrokeWidth ?? 1.0f;
@@ -432,8 +432,8 @@ namespace Dashboard.VertexGenerator
DrawQueue.StartDrawCall(Viewport);
for (int i = 0; i < RectangleList.Count; i++)
{
QRectangle outer = RectangleList[i];
QRectangle inner = new QRectangle(
Rectangle outer = RectangleList[i];
Rectangle inner = new Rectangle(
outer.Right - stroke, outer.Bottom - stroke,
outer.Left + stroke, outer.Top + stroke);
@@ -457,7 +457,7 @@ namespace Dashboard.VertexGenerator
DrawQueue.EndDrawCall();
}
private void GenerateRectangleBase(in QRectangle rectangle, float radius)
private void GenerateRectangleBase(in Rectangle rectangle, float radius)
{
/*
+--j-------i--+
@@ -599,7 +599,7 @@ namespace Dashboard.VertexGenerator
DrawQueue.AddElement(1); DrawQueue.AddElement(previous); DrawQueue.AddElement(6);
}
private void GenerateRectangleStripStraight(in QRectangle rectangle)
private void GenerateRectangleStripStraight(in Rectangle rectangle)
{
/*
h---------g
@@ -649,7 +649,7 @@ namespace Dashboard.VertexGenerator
DrawQueue.AddElement(4); DrawQueue.AddElement(3); DrawQueue.AddElement(7); // SWW
}
private void GenerateRectangleStripNarrow(in QRectangle rectangle, float radius)
private void GenerateRectangleStripNarrow(in Rectangle rectangle, float radius)
{
/*
v-j---i-u
@@ -843,7 +843,7 @@ namespace Dashboard.VertexGenerator
DrawQueue.AddElement(16); DrawQueue.AddElement(previous); DrawQueue.AddElement(17);
}
private void GenerateRectangleStripWide(in QRectangle rectangle, float radius)
private void GenerateRectangleStripWide(in Rectangle rectangle, float radius)
{
/*
l---k
@@ -1016,7 +1016,7 @@ namespace Dashboard.VertexGenerator
{
Frame frame = queue.Dequeue();
ImageCommandFlags flags = (ImageCommandFlags)frame.I1;
QImage image = queue.Dequeue().As<QImage>();
Image image = queue.Dequeue().As<Image>();
int count = flags.HasFlag(ImageCommandFlags.Single) ? 1 : frame.I2;
if (flags.HasFlag(ImageCommandFlags.Image3d))
@@ -1029,22 +1029,22 @@ namespace Dashboard.VertexGenerator
}
}
private void Image2d(DrawQueue queue, QImage image, int count, bool uv)
private void Image2d(DrawQueue queue, Image image, int count, bool uv)
{
DrawQueue.StartDrawCall(Viewport, image);
for (int i = 0; i < count; i++)
{
QRectangle rect = (QRectangle)queue.Dequeue();
QRectangle uvs;
Rectangle rect = (Rectangle)queue.Dequeue();
Rectangle uvs;
if (uv)
{
uvs = (QRectangle)queue.Dequeue();
uvs = (Rectangle)queue.Dequeue();
}
else
{
uvs = new QRectangle(1, 1, 0, 0);
uvs = new Rectangle(1, 1, 0, 0);
}
DrawQueue.RestoreOffset();
@@ -1073,14 +1073,14 @@ namespace Dashboard.VertexGenerator
DrawQueue.EndDrawCall();
}
private void Image3d(DrawQueue queue, QImage image, int count)
private void Image3d(DrawQueue queue, Image image, int count)
{
DrawQueue.StartDrawCall(Viewport, image);
for (int i = 0; i < count; i++)
{
QRectangle rect = (QRectangle)queue.Dequeue();
QRectangle uvs = (QRectangle)queue.Dequeue();
Rectangle rect = (Rectangle)queue.Dequeue();
Rectangle uvs = (Rectangle)queue.Dequeue();
int layer = (int)queue.Dequeue();
DrawQueue.RestoreOffset();

View File

@@ -20,7 +20,7 @@ namespace Dashboard.Demo
public class EmptyView : View
{
private QFont? font;
private Font? font;
DashboardBlurg dblurg = new DashboardBlurg();
BlurgResult? result;
// private readonly Label Label = new Label() { Text = "Hello world!", Position = new QVec2(300, 300) };
@@ -43,7 +43,7 @@ namespace Dashboard.Demo
}
cmd.PutBlurgText(dblurg, result!, new Vector2(300, 300));
cmd.Rectangle(new QRectangle(16, 16, 0, 0));
cmd.Rectangle(new Rectangle(16, 16, 0, 0));
// Label.Paint(cmd);
}
}