ImageSharp/ImageSharp.Drawing/Text/TextUtilities.cs
2026-08-03 22:31:27 +02:00

96 lines
4.3 KiB
C#

// Copyright (c) Six Labors.
// Licensed under the Six Labors Split License.
using SixLabors.Fonts.Rendering;
using SixLabors.ImageSharp.Drawing.Processing;
using SixLabors.ImageSharp.PixelFormats;
namespace SixLabors.ImageSharp.Drawing.Text {
internal static class TextUtilities
{
public static IntersectionRule MapFillRule(FillRule fillRule)
=> fillRule switch
{
FillRule.EvenOdd => IntersectionRule.EvenOdd,
FillRule.NonZero => IntersectionRule.NonZero,
_ => IntersectionRule.NonZero,
};
public static PixelAlphaCompositionMode MapCompositionMode(CompositeMode mode)
=> mode switch
{
CompositeMode.Clear => PixelAlphaCompositionMode.Clear,
CompositeMode.Src => PixelAlphaCompositionMode.Src,
CompositeMode.Dest => PixelAlphaCompositionMode.Dest,
CompositeMode.SrcOver => PixelAlphaCompositionMode.SrcOver,
CompositeMode.DestOver => PixelAlphaCompositionMode.DestOver,
CompositeMode.SrcIn => PixelAlphaCompositionMode.SrcIn,
CompositeMode.DestIn => PixelAlphaCompositionMode.DestIn,
CompositeMode.SrcOut => PixelAlphaCompositionMode.SrcOut,
CompositeMode.DestOut => PixelAlphaCompositionMode.DestOut,
CompositeMode.SrcAtop => PixelAlphaCompositionMode.SrcAtop,
CompositeMode.DestAtop => PixelAlphaCompositionMode.DestAtop,
CompositeMode.Xor => PixelAlphaCompositionMode.Xor,
_ => PixelAlphaCompositionMode.SrcOver,
};
public static PixelColorBlendingMode MapBlendingMode(CompositeMode mode)
=> mode switch
{
CompositeMode.Plus => PixelColorBlendingMode.Add,
CompositeMode.Screen => PixelColorBlendingMode.Screen,
CompositeMode.Overlay => PixelColorBlendingMode.Overlay,
CompositeMode.Darken => PixelColorBlendingMode.Darken,
CompositeMode.Lighten => PixelColorBlendingMode.Lighten,
CompositeMode.HardLight => PixelColorBlendingMode.HardLight,
CompositeMode.Multiply => PixelColorBlendingMode.Multiply,
// TODO: We do not support the following separate alpha blending modes:
// - ColorDodge, ColorBurn, SoftLight, Difference, Exclusion
// TODO: We do not support the non-alpha blending modes.
// - Hue, Saturation, Color, Luminosity
_ => PixelColorBlendingMode.Normal
};
public static DrawingOptions CloneOrReturnForRules(
this DrawingOptions drawingOptions,
IntersectionRule intersectionRule,
PixelAlphaCompositionMode compositionMode,
PixelColorBlendingMode colorBlendingMode)
{
if (drawingOptions.ShapeOptions.IntersectionRule == intersectionRule &&
drawingOptions.GraphicsOptions.AlphaCompositionMode == compositionMode &&
drawingOptions.GraphicsOptions.ColorBlendingMode == colorBlendingMode)
{
return drawingOptions;
}
ShapeOptions shapeOptions = drawingOptions.ShapeOptions.DeepClone();
shapeOptions.IntersectionRule = intersectionRule;
GraphicsOptions graphicsOptions = drawingOptions.GraphicsOptions.DeepClone();
graphicsOptions.AlphaCompositionMode = compositionMode;
graphicsOptions.ColorBlendingMode = colorBlendingMode;
return new DrawingOptions(graphicsOptions, shapeOptions, drawingOptions.Transform);
}
public static GraphicsOptions CloneOrReturnForRules(
this GraphicsOptions graphicsOptions,
PixelAlphaCompositionMode compositionMode,
PixelColorBlendingMode colorBlendingMode)
{
if (graphicsOptions.AlphaCompositionMode == compositionMode &&
graphicsOptions.ColorBlendingMode == colorBlendingMode)
{
return graphicsOptions;
}
GraphicsOptions clone = graphicsOptions.DeepClone();
clone.AlphaCompositionMode = compositionMode;
clone.ColorBlendingMode = colorBlendingMode;
return clone;
}
}
}