Initial commit: .NET MAUI Linux Platform
Complete Linux platform implementation for .NET MAUI with:
- 35+ Skia-rendered controls (Button, Label, Entry, CarouselView, etc.)
- Platform services (Clipboard, FilePicker, Notifications, DragDrop, etc.)
- Accessibility support (AT-SPI2, High Contrast)
- HiDPI and Input Method support
- 216 unit tests
- CI/CD workflows
- Project templates
- Documentation
🤖 Generated with Claude Code
This commit is contained in:
181
Extensions/ColorExtensions.cs
Normal file
181
Extensions/ColorExtensions.cs
Normal file
@@ -0,0 +1,181 @@
|
||||
// Licensed to the .NET Foundation under one or more agreements.
|
||||
// The .NET Foundation licenses this file to you under the MIT license.
|
||||
|
||||
using SkiaSharp;
|
||||
using Microsoft.Maui.Graphics;
|
||||
|
||||
namespace Microsoft.Maui.Platform;
|
||||
|
||||
/// <summary>
|
||||
/// Extension methods for color conversions between MAUI and SkiaSharp.
|
||||
/// </summary>
|
||||
public static class ColorExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// Converts a MAUI Color to an SKColor.
|
||||
/// </summary>
|
||||
public static SKColor ToSKColor(this Color color)
|
||||
{
|
||||
if (color == null)
|
||||
return SKColors.Transparent;
|
||||
|
||||
return new SKColor(
|
||||
(byte)(color.Red * 255),
|
||||
(byte)(color.Green * 255),
|
||||
(byte)(color.Blue * 255),
|
||||
(byte)(color.Alpha * 255));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Converts an SKColor to a MAUI Color.
|
||||
/// </summary>
|
||||
public static Color ToMauiColor(this SKColor color)
|
||||
{
|
||||
return new Color(
|
||||
color.Red / 255f,
|
||||
color.Green / 255f,
|
||||
color.Blue / 255f,
|
||||
color.Alpha / 255f);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new SKColor with the specified alpha value.
|
||||
/// </summary>
|
||||
public static SKColor WithAlpha(this SKColor color, byte alpha)
|
||||
{
|
||||
return new SKColor(color.Red, color.Green, color.Blue, alpha);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a lighter version of the color.
|
||||
/// </summary>
|
||||
public static SKColor Lighter(this SKColor color, float factor = 0.2f)
|
||||
{
|
||||
return new SKColor(
|
||||
(byte)Math.Min(255, color.Red + (255 - color.Red) * factor),
|
||||
(byte)Math.Min(255, color.Green + (255 - color.Green) * factor),
|
||||
(byte)Math.Min(255, color.Blue + (255 - color.Blue) * factor),
|
||||
color.Alpha);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a darker version of the color.
|
||||
/// </summary>
|
||||
public static SKColor Darker(this SKColor color, float factor = 0.2f)
|
||||
{
|
||||
return new SKColor(
|
||||
(byte)(color.Red * (1 - factor)),
|
||||
(byte)(color.Green * (1 - factor)),
|
||||
(byte)(color.Blue * (1 - factor)),
|
||||
color.Alpha);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the luminance of the color.
|
||||
/// </summary>
|
||||
public static float GetLuminance(this SKColor color)
|
||||
{
|
||||
return 0.299f * color.Red / 255f +
|
||||
0.587f * color.Green / 255f +
|
||||
0.114f * color.Blue / 255f;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Determines if the color is considered light.
|
||||
/// </summary>
|
||||
public static bool IsLight(this SKColor color)
|
||||
{
|
||||
return color.GetLuminance() > 0.5f;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets a contrasting color (black or white) for text on this background.
|
||||
/// </summary>
|
||||
public static SKColor GetContrastingColor(this SKColor backgroundColor)
|
||||
{
|
||||
return backgroundColor.IsLight() ? SKColors.Black : SKColors.White;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Converts a MAUI Paint to an SKColor if possible.
|
||||
/// </summary>
|
||||
public static SKColor? ToSKColorOrNull(this Paint? paint)
|
||||
{
|
||||
if (paint is SolidPaint solidPaint && solidPaint.Color != null)
|
||||
return solidPaint.Color.ToSKColor();
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Converts a MAUI Paint to an SKColor, using a default if not a solid color.
|
||||
/// </summary>
|
||||
public static SKColor ToSKColor(this Paint? paint, SKColor defaultColor)
|
||||
{
|
||||
return paint.ToSKColorOrNull() ?? defaultColor;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Font extensions for converting MAUI fonts to SkiaSharp.
|
||||
/// </summary>
|
||||
public static class FontExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets the SKFontStyle from a MAUI Font.
|
||||
/// </summary>
|
||||
public static SKFontStyle ToSKFontStyle(this Font font)
|
||||
{
|
||||
// Map MAUI FontWeight (enum with numeric values) to SKFontStyleWeight
|
||||
var weight = (int)font.Weight switch
|
||||
{
|
||||
100 => SKFontStyleWeight.Thin, // Thin
|
||||
200 => SKFontStyleWeight.ExtraLight, // UltraLight
|
||||
300 => SKFontStyleWeight.Light, // Light
|
||||
400 => SKFontStyleWeight.Normal, // Regular
|
||||
500 => SKFontStyleWeight.Medium, // Medium
|
||||
600 => SKFontStyleWeight.SemiBold, // Semibold
|
||||
700 => SKFontStyleWeight.Bold, // Bold
|
||||
800 => SKFontStyleWeight.ExtraBold, // Heavy
|
||||
900 => SKFontStyleWeight.Black, // Black
|
||||
_ => font.Weight >= FontWeight.Bold ? SKFontStyleWeight.Bold : SKFontStyleWeight.Normal
|
||||
};
|
||||
|
||||
var slant = font.Slant switch
|
||||
{
|
||||
FontSlant.Italic => SKFontStyleSlant.Italic,
|
||||
FontSlant.Oblique => SKFontStyleSlant.Oblique,
|
||||
_ => SKFontStyleSlant.Upright
|
||||
};
|
||||
|
||||
return new SKFontStyle(weight, SKFontStyleWidth.Normal, slant);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates an SKFont from a MAUI Font.
|
||||
/// </summary>
|
||||
public static SKFont ToSKFont(this Font font, float defaultSize = 14f)
|
||||
{
|
||||
var size = font.Size > 0 ? (float)font.Size : defaultSize;
|
||||
var typeface = SKTypeface.FromFamilyName(font.Family ?? "sans-serif", font.ToSKFontStyle());
|
||||
return new SKFont(typeface, size);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Thickness extensions for converting MAUI Thickness to SKRect.
|
||||
/// </summary>
|
||||
public static class ThicknessExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// Converts a MAUI Thickness to an SKRect representing padding/margin.
|
||||
/// </summary>
|
||||
public static SKRect ToSKRect(this Thickness thickness)
|
||||
{
|
||||
return new SKRect(
|
||||
(float)thickness.Left,
|
||||
(float)thickness.Top,
|
||||
(float)thickness.Right,
|
||||
(float)thickness.Bottom);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user