mirror of
https://github.com/UglyToad/PdfPig.git
synced 2025-04-05 20:55:01 +08:00
Remove CurrentGraphicsState GetCurrentState() from IOperationContext.
This commit is contained in:
parent
14465f0198
commit
eb85f67b18
@ -7,6 +7,8 @@
|
|||||||
using PdfPig.Tokens;
|
using PdfPig.Tokens;
|
||||||
using PdfPig.Core;
|
using PdfPig.Core;
|
||||||
using Tokens;
|
using Tokens;
|
||||||
|
using UglyToad.PdfPig.Graphics.Core;
|
||||||
|
using UglyToad.PdfPig.Graphics.Operations.TextPositioning;
|
||||||
|
|
||||||
internal class TestOperationContext : IOperationContext
|
internal class TestOperationContext : IOperationContext
|
||||||
{
|
{
|
||||||
@ -184,6 +186,91 @@
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void AdjustTextMatrix(double tx, double ty)
|
||||||
|
{
|
||||||
|
var matrix = TransformationMatrix.GetTranslationMatrix(tx, ty);
|
||||||
|
TextMatrices.TextMatrix = matrix.Multiply(TextMatrices.TextMatrix);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetFlatnessTolerance(decimal tolerance)
|
||||||
|
{
|
||||||
|
GetCurrentState().Flatness = tolerance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetLineCap(LineCapStyle cap)
|
||||||
|
{
|
||||||
|
GetCurrentState().CapStyle = cap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetLineDashPattern(LineDashPattern pattern)
|
||||||
|
{
|
||||||
|
GetCurrentState().LineDashPattern = pattern;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetLineJoin(LineJoinStyle join)
|
||||||
|
{
|
||||||
|
GetCurrentState().JoinStyle = join;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetLineWidth(decimal width)
|
||||||
|
{
|
||||||
|
GetCurrentState().LineWidth = width;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetMiterLimit(decimal limit)
|
||||||
|
{
|
||||||
|
GetCurrentState().MiterLimit = limit;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void MoveToNextLineWithOffset()
|
||||||
|
{
|
||||||
|
var tdOperation = new MoveToNextLineWithOffset(0, -1 * (decimal)GetCurrentState().FontState.Leading);
|
||||||
|
tdOperation.Run(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetFontAndSize(NameToken font, double size)
|
||||||
|
{
|
||||||
|
var currentState = GetCurrentState();
|
||||||
|
currentState.FontState.FontSize = size;
|
||||||
|
currentState.FontState.FontName = font;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetHorizontalScaling(double scale)
|
||||||
|
{
|
||||||
|
GetCurrentState().FontState.HorizontalScaling = scale;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetTextLeading(double leading)
|
||||||
|
{
|
||||||
|
GetCurrentState().FontState.Leading = leading;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetTextRenderingMode(TextRenderingMode mode)
|
||||||
|
{
|
||||||
|
GetCurrentState().FontState.TextRenderingMode = mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetTextRise(double rise)
|
||||||
|
{
|
||||||
|
GetCurrentState().FontState.Rise = rise;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetWordSpacing(double spacing)
|
||||||
|
{
|
||||||
|
GetCurrentState().FontState.WordSpacing = spacing;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ModifyCurrentTransformationMatrix(double[] value)
|
||||||
|
{
|
||||||
|
var ctm = GetCurrentState().CurrentTransformationMatrix;
|
||||||
|
GetCurrentState().CurrentTransformationMatrix = TransformationMatrix.FromArray(value).Multiply(ctm);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetCharacterSpacing(double spacing)
|
||||||
|
{
|
||||||
|
GetCurrentState().FontState.CharacterSpacing = spacing;
|
||||||
|
}
|
||||||
|
|
||||||
private class TestFontFactory : IFontFactory
|
private class TestFontFactory : IFontFactory
|
||||||
{
|
{
|
||||||
public IFont Get(DictionaryToken dictionary)
|
public IFont Get(DictionaryToken dictionary)
|
||||||
|
@ -1,9 +1,5 @@
|
|||||||
namespace UglyToad.PdfPig.Graphics
|
namespace UglyToad.PdfPig.Graphics
|
||||||
{
|
{
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Diagnostics;
|
|
||||||
using System.Linq;
|
|
||||||
using Colors;
|
using Colors;
|
||||||
using Content;
|
using Content;
|
||||||
using Core;
|
using Core;
|
||||||
@ -14,8 +10,13 @@
|
|||||||
using Parser;
|
using Parser;
|
||||||
using PdfFonts;
|
using PdfFonts;
|
||||||
using PdfPig.Core;
|
using PdfPig.Core;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Linq;
|
||||||
using Tokenization.Scanner;
|
using Tokenization.Scanner;
|
||||||
using Tokens;
|
using Tokens;
|
||||||
|
using UglyToad.PdfPig.Graphics.Operations.TextPositioning;
|
||||||
using XObjects;
|
using XObjects;
|
||||||
using static PdfPig.Core.PdfSubpath;
|
using static PdfPig.Core.PdfSubpath;
|
||||||
|
|
||||||
@ -815,9 +816,86 @@
|
|||||||
{
|
{
|
||||||
var matrix = TransformationMatrix.GetTranslationMatrix(tx, ty);
|
var matrix = TransformationMatrix.GetTranslationMatrix(tx, ty);
|
||||||
|
|
||||||
var newMatrix = matrix.Multiply(TextMatrices.TextMatrix);
|
TextMatrices.TextMatrix = matrix.Multiply(TextMatrices.TextMatrix);
|
||||||
|
}
|
||||||
|
|
||||||
TextMatrices.TextMatrix = newMatrix;
|
public void SetFlatnessTolerance(decimal tolerance)
|
||||||
|
{
|
||||||
|
GetCurrentState().Flatness = tolerance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetLineCap(LineCapStyle cap)
|
||||||
|
{
|
||||||
|
GetCurrentState().CapStyle = cap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetLineDashPattern(LineDashPattern pattern)
|
||||||
|
{
|
||||||
|
GetCurrentState().LineDashPattern = pattern;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetLineJoin(LineJoinStyle join)
|
||||||
|
{
|
||||||
|
GetCurrentState().JoinStyle = join;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetLineWidth(decimal width)
|
||||||
|
{
|
||||||
|
GetCurrentState().LineWidth = width;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetMiterLimit(decimal limit)
|
||||||
|
{
|
||||||
|
GetCurrentState().MiterLimit = limit;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void MoveToNextLineWithOffset()
|
||||||
|
{
|
||||||
|
var tdOperation = new MoveToNextLineWithOffset(0, -1 * (decimal)GetCurrentState().FontState.Leading);
|
||||||
|
tdOperation.Run(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetFontAndSize(NameToken font, double size)
|
||||||
|
{
|
||||||
|
var currentState = GetCurrentState();
|
||||||
|
currentState.FontState.FontSize = size;
|
||||||
|
currentState.FontState.FontName = font;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetHorizontalScaling(double scale)
|
||||||
|
{
|
||||||
|
GetCurrentState().FontState.HorizontalScaling = scale;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetTextLeading(double leading)
|
||||||
|
{
|
||||||
|
GetCurrentState().FontState.Leading = leading;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetTextRenderingMode(TextRenderingMode mode)
|
||||||
|
{
|
||||||
|
GetCurrentState().FontState.TextRenderingMode = mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetTextRise(double rise)
|
||||||
|
{
|
||||||
|
GetCurrentState().FontState.Rise = rise;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetWordSpacing(double spacing)
|
||||||
|
{
|
||||||
|
GetCurrentState().FontState.WordSpacing = spacing;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ModifyCurrentTransformationMatrix(double[] value)
|
||||||
|
{
|
||||||
|
var ctm = GetCurrentState().CurrentTransformationMatrix;
|
||||||
|
GetCurrentState().CurrentTransformationMatrix = TransformationMatrix.FromArray(value).Multiply(ctm);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetCharacterSpacing(double spacing)
|
||||||
|
{
|
||||||
|
GetCurrentState().FontState.CharacterSpacing = spacing;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -3,6 +3,7 @@
|
|||||||
using PdfPig.Core;
|
using PdfPig.Core;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using Tokens;
|
using Tokens;
|
||||||
|
using UglyToad.PdfPig.Graphics.Core;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The current graphics state context when running a PDF content stream.
|
/// The current graphics state context when running a PDF content stream.
|
||||||
@ -19,12 +20,6 @@
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
PdfPoint CurrentPosition { get; set; }
|
PdfPoint CurrentPosition { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Get the currently active <see cref="CurrentGraphicsState"/>. States are stored on a stack structure.
|
|
||||||
/// </summary>
|
|
||||||
/// <returns>The currently active graphics state.</returns>
|
|
||||||
CurrentGraphicsState GetCurrentState();
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The matrices for the current text state.
|
/// The matrices for the current text state.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -189,5 +184,90 @@
|
|||||||
/// Modify the clipping rule of the current path.
|
/// Modify the clipping rule of the current path.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
void ModifyClippingIntersect(FillingRule clippingRule);
|
void ModifyClippingIntersect(FillingRule clippingRule);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Set the flatness tolerance in the graphics state.
|
||||||
|
/// Flatness is a number in the range 0 to 100; a value of 0 specifies the output device’s default flatness tolerance.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="tolerance"></param>
|
||||||
|
void SetFlatnessTolerance(decimal tolerance);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Set the line cap style in the graphics state.
|
||||||
|
/// </summary>
|
||||||
|
void SetLineCap(LineCapStyle cap);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Set the line dash pattern in the graphics state.
|
||||||
|
/// </summary>
|
||||||
|
void SetLineDashPattern(LineDashPattern pattern);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Set the line join style in the graphics state.
|
||||||
|
/// </summary>
|
||||||
|
void SetLineJoin(LineJoinStyle join);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Set the line width in the graphics state.
|
||||||
|
/// </summary>
|
||||||
|
void SetLineWidth(decimal width);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Set the miter limit in the graphics state.
|
||||||
|
/// </summary>
|
||||||
|
void SetMiterLimit(decimal limit);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Move to the start of the next line.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// This performs this operation: 0 -Tl Td
|
||||||
|
/// The offset is negative leading text (Tl) value, this is incorrect in the specification.
|
||||||
|
/// </remarks>
|
||||||
|
void MoveToNextLineWithOffset();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Set the font and the font size.
|
||||||
|
/// Font is the name of a font resource in the Font subdictionary of the current resource dictionary.
|
||||||
|
/// Size is a number representing a scale factor.
|
||||||
|
/// </summary>
|
||||||
|
void SetFontAndSize(NameToken font, double size);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Set the horizontal scaling.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="scale"></param>
|
||||||
|
void SetHorizontalScaling(double scale);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Set the text leading.
|
||||||
|
/// </summary>
|
||||||
|
void SetTextLeading(double leading);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Set the text rendering mode.
|
||||||
|
/// </summary>
|
||||||
|
void SetTextRenderingMode(TextRenderingMode mode);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Set text rise.
|
||||||
|
/// </summary>
|
||||||
|
void SetTextRise(double rise);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Sets the word spacing.
|
||||||
|
/// </summary>
|
||||||
|
void SetWordSpacing(double spacing);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Modify the current transformation matrix by concatenating the specified matrix.
|
||||||
|
/// </summary>
|
||||||
|
void ModifyCurrentTransformationMatrix(double[] value);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Set the character spacing to a number expressed in unscaled text space units.
|
||||||
|
/// Initial value: 0.
|
||||||
|
/// </summary>
|
||||||
|
void SetCharacterSpacing(double spacing);
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -35,7 +35,7 @@
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public void Run(IOperationContext operationContext)
|
public void Run(IOperationContext operationContext)
|
||||||
{
|
{
|
||||||
operationContext.GetCurrentState().Flatness = Tolerance;
|
operationContext.SetFlatnessTolerance(Tolerance);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
|
@ -45,7 +45,7 @@
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public void Run(IOperationContext operationContext)
|
public void Run(IOperationContext operationContext)
|
||||||
{
|
{
|
||||||
operationContext.GetCurrentState().CapStyle = Cap;
|
operationContext.SetLineCap(Cap);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
|
@ -33,7 +33,7 @@
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public void Run(IOperationContext operationContext)
|
public void Run(IOperationContext operationContext)
|
||||||
{
|
{
|
||||||
operationContext.GetCurrentState().LineDashPattern = Pattern;
|
operationContext.SetLineDashPattern(Pattern);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
|
@ -40,7 +40,7 @@
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public void Run(IOperationContext operationContext)
|
public void Run(IOperationContext operationContext)
|
||||||
{
|
{
|
||||||
operationContext.GetCurrentState().JoinStyle = Join;
|
operationContext.SetLineJoin(Join);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
|
@ -33,9 +33,7 @@
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public void Run(IOperationContext operationContext)
|
public void Run(IOperationContext operationContext)
|
||||||
{
|
{
|
||||||
var currentState = operationContext.GetCurrentState();
|
operationContext.SetLineWidth(Width);
|
||||||
|
|
||||||
currentState.LineWidth = Width;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
|
@ -33,9 +33,7 @@
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public void Run(IOperationContext operationContext)
|
public void Run(IOperationContext operationContext)
|
||||||
{
|
{
|
||||||
var currentState = operationContext.GetCurrentState();
|
operationContext.SetMiterLimit(Limit);
|
||||||
|
|
||||||
currentState.MiterLimit = Limit;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
|
@ -44,13 +44,7 @@
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public void Run(IOperationContext operationContext)
|
public void Run(IOperationContext operationContext)
|
||||||
{
|
{
|
||||||
var newMatrix = TransformationMatrix.FromArray(Value);
|
operationContext.ModifyCurrentTransformationMatrix(Array.ConvertAll(Value, x => (double)x));
|
||||||
|
|
||||||
var ctm = operationContext.GetCurrentState().CurrentTransformationMatrix;
|
|
||||||
|
|
||||||
var newCtm = newMatrix.Multiply(ctm);
|
|
||||||
|
|
||||||
operationContext.GetCurrentState().CurrentTransformationMatrix = newCtm;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
|
@ -32,9 +32,7 @@
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public void Run(IOperationContext operationContext)
|
public void Run(IOperationContext operationContext)
|
||||||
{
|
{
|
||||||
var tdOperation = new MoveToNextLineWithOffset(0, -1 * (decimal)operationContext.GetCurrentState().FontState.Leading);
|
operationContext.MoveToNextLineWithOffset();
|
||||||
|
|
||||||
tdOperation.Run(operationContext);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
|
@ -34,9 +34,7 @@
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public void Run(IOperationContext operationContext)
|
public void Run(IOperationContext operationContext)
|
||||||
{
|
{
|
||||||
var currentState = operationContext.GetCurrentState();
|
operationContext.SetCharacterSpacing((double)Spacing);
|
||||||
|
|
||||||
currentState.FontState.CharacterSpacing = (double)Spacing;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
|
@ -48,10 +48,7 @@
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public void Run(IOperationContext operationContext)
|
public void Run(IOperationContext operationContext)
|
||||||
{
|
{
|
||||||
var currentState = operationContext.GetCurrentState();
|
operationContext.SetFontAndSize(Font, (double)Size);
|
||||||
|
|
||||||
currentState.FontState.FontSize = (double)Size;
|
|
||||||
currentState.FontState.FontName = Font;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
|
@ -30,9 +30,7 @@
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public void Run(IOperationContext operationContext)
|
public void Run(IOperationContext operationContext)
|
||||||
{
|
{
|
||||||
var currentState = operationContext.GetCurrentState();
|
operationContext.SetHorizontalScaling((double)Scale);
|
||||||
|
|
||||||
currentState.FontState.HorizontalScaling = (double)Scale;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
|
@ -33,9 +33,7 @@
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public void Run(IOperationContext operationContext)
|
public void Run(IOperationContext operationContext)
|
||||||
{
|
{
|
||||||
var currentState = operationContext.GetCurrentState();
|
operationContext.SetTextLeading((double)Leading);
|
||||||
|
|
||||||
currentState.FontState.Leading = (double)Leading;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
|
@ -33,9 +33,7 @@
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public void Run(IOperationContext operationContext)
|
public void Run(IOperationContext operationContext)
|
||||||
{
|
{
|
||||||
var currentState = operationContext.GetCurrentState();
|
operationContext.SetTextRenderingMode(Mode);
|
||||||
|
|
||||||
currentState.FontState.TextRenderingMode = Mode;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
|
@ -33,9 +33,7 @@
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public void Run(IOperationContext operationContext)
|
public void Run(IOperationContext operationContext)
|
||||||
{
|
{
|
||||||
var currentState = operationContext.GetCurrentState();
|
operationContext.SetTextRise((double)Rise);
|
||||||
|
|
||||||
currentState.FontState.Rise = (double)Rise;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
|
@ -34,9 +34,7 @@
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public void Run(IOperationContext operationContext)
|
public void Run(IOperationContext operationContext)
|
||||||
{
|
{
|
||||||
var currentState = operationContext.GetCurrentState();
|
operationContext.SetWordSpacing((double)Spacing);
|
||||||
|
|
||||||
currentState.FontState.WordSpacing = (double)Spacing;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
|
Loading…
Reference in New Issue
Block a user