您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
166 行
4.8 KiB
166 行
4.8 KiB
using System.Collections.Generic;
|
|
using Unity.UIWidgets.foundation;
|
|
using Unity.UIWidgets.ui;
|
|
|
|
namespace Unity.UIWidgets.painting {
|
|
public class HSVColor {
|
|
HSVColor(float alpha, float hue, float saturation, float value) {
|
|
D.assert(this.alpha >= 0);
|
|
D.assert(this.alpha <= 1);
|
|
D.assert(hue >= 0);
|
|
D.assert(hue <= 360);
|
|
D.assert(saturation >= 0);
|
|
D.assert(saturation <= 1);
|
|
D.assert(value >= 0);
|
|
D.assert(value <= 1);
|
|
this.alpha = alpha;
|
|
this.hue = hue;
|
|
this.saturation = saturation;
|
|
this.value = value;
|
|
}
|
|
|
|
public static HSVColor fromAHSV(float alpha, float hue, float saturation, float value) {
|
|
return new HSVColor(alpha, hue, saturation, value);
|
|
}
|
|
|
|
public HSVColor withAlpha(float alpha) {
|
|
return fromAHSV(alpha, this.hue, this.saturation, this.value);
|
|
}
|
|
|
|
public HSVColor withHue(float hue) {
|
|
return fromAHSV(this.alpha, hue, this.saturation, this.value);
|
|
}
|
|
|
|
public HSVColor withSaturation(float saturation) {
|
|
return fromAHSV(this.alpha, this.hue, saturation, this.value);
|
|
}
|
|
|
|
public HSVColor withValue(float value) {
|
|
return fromAHSV(this.alpha, this.hue, this.saturation, value);
|
|
}
|
|
|
|
public Color toColor() {
|
|
float chroma = this.saturation * this.value;
|
|
float secondary = chroma * (1.0f - (((this.hue / 60.0f) % 2.0f) - 1.0f).abs());
|
|
float match = this.value - chroma;
|
|
|
|
return ColorUtils._colorFromHue(this.alpha, this.hue, chroma, secondary, match);
|
|
}
|
|
|
|
public readonly float alpha;
|
|
public readonly float hue;
|
|
public readonly float saturation;
|
|
public readonly float value;
|
|
}
|
|
|
|
public class ColorSwatch<T> : Color {
|
|
public ColorSwatch(
|
|
long primary,
|
|
Dictionary<T, Color> swatch) : base(primary) {
|
|
this._swatch = swatch;
|
|
}
|
|
|
|
protected readonly Dictionary<T, Color> _swatch;
|
|
|
|
public Color this[T index] {
|
|
get { return this._swatch[index]; }
|
|
}
|
|
|
|
|
|
public bool Equals(ColorSwatch<T> other) {
|
|
if (ReferenceEquals(null, other)) {
|
|
return false;
|
|
}
|
|
|
|
if (ReferenceEquals(this, other)) {
|
|
return true;
|
|
}
|
|
|
|
return this.value == other.value && this._swatch == other._swatch;
|
|
}
|
|
|
|
public override bool Equals(object obj) {
|
|
if (ReferenceEquals(null, obj)) {
|
|
return false;
|
|
}
|
|
|
|
if (ReferenceEquals(this, obj)) {
|
|
return true;
|
|
}
|
|
|
|
if (obj.GetType() != this.GetType()) {
|
|
return false;
|
|
}
|
|
|
|
return this.Equals((ColorSwatch<T>) obj);
|
|
}
|
|
|
|
public static bool operator ==(ColorSwatch<T> left, ColorSwatch<T> right) {
|
|
return Equals(left, right);
|
|
}
|
|
|
|
public static bool operator !=(ColorSwatch<T> left, ColorSwatch<T> right) {
|
|
return !Equals(left, right);
|
|
}
|
|
|
|
public override int GetHashCode() {
|
|
unchecked {
|
|
var hashCode = (int) this.value;
|
|
hashCode = (hashCode * 397) ^ this._swatch.GetHashCode();
|
|
return hashCode;
|
|
}
|
|
}
|
|
|
|
public override string ToString() {
|
|
return this.GetType() + "(primary value: " + base.ToString() + ")";
|
|
}
|
|
}
|
|
|
|
public static class ColorUtils {
|
|
internal static Color _colorFromHue(
|
|
float alpha,
|
|
float hue,
|
|
float chroma,
|
|
float secondary,
|
|
float match
|
|
) {
|
|
float red;
|
|
float green;
|
|
float blue;
|
|
if (hue < 60.0) {
|
|
red = chroma;
|
|
green = secondary;
|
|
blue = 0.0f;
|
|
}
|
|
else if (hue < 120.0) {
|
|
red = secondary;
|
|
green = chroma;
|
|
blue = 0.0f;
|
|
}
|
|
else if (hue < 180.0) {
|
|
red = 0.0f;
|
|
green = chroma;
|
|
blue = secondary;
|
|
}
|
|
else if (hue < 240.0) {
|
|
red = 0.0f;
|
|
green = secondary;
|
|
blue = chroma;
|
|
}
|
|
else if (hue < 300.0) {
|
|
red = secondary;
|
|
green = 0.0f;
|
|
blue = chroma;
|
|
}
|
|
else {
|
|
red = chroma;
|
|
green = 0.0f;
|
|
blue = secondary;
|
|
}
|
|
|
|
return Color.fromARGB((alpha * 0xFF).round(),
|
|
((red + match) * 0xFF).round(),
|
|
((green + match) * 0xFF).round(), ((blue + match) * 0xFF).round());
|
|
}
|
|
}
|
|
}
|