Welcome to mirror list, hosted at ThFree Co, Russian Federation.

Color.cs « Structures « UVtools.WPF - github.com/sn4k3/UVtools.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: af6e38df9a4e2bc35b3ab74f036e346b8dadf549 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/*
 *                     GNU AFFERO GENERAL PUBLIC LICENSE
 *                       Version 3, 19 November 2007
 *  Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
 *  Everyone is permitted to copy and distribute verbatim copies
 *  of this license document, but changing it is not allowed.
 */
using System;
using Avalonia.Media;


namespace UVtools.WPF.Structures;

[Serializable]
public class Color
{
    public byte A;
    public byte R;
    public byte G;
    public byte B;

    public Color()
    { }

    public Color(byte a, byte r, byte g, byte b)
    {
        A = a;
        R = r;
        G = g;
        B = b;
    }

    public Color(Color color)
        : this(color.A, color.R, color.G, color.B)
    {
    }

    public Color(Avalonia.Media.Color color)
        : this(color.A, color.R, color.G, color.B)
    {
    }

    public Color(SolidColorBrush brush)
        : this(brush.Color)
    {
    }

    public System.Drawing.Color ToDotNet()
    {
        return System.Drawing.Color.FromArgb(A, R, G, B);
    }

    public Avalonia.Media.Color ToAvalonia()
    {
        return new Avalonia.Media.Color(A, R, G, B);
    }

    public bool IsEmpty => ReferenceEquals(this, Empty);

    public static Color FromArgb(byte a, byte r, byte g, byte b)
    {
        return new Color(a, r, g, b);
    }

    public static Color Empty => new(0,0,0,0);

    public Color FactorColor(byte pixelColor, byte min = 0, byte max = byte.MaxValue) =>
        FactorColor(pixelColor / 255f, min, max);

    public Color FactorColor(float factor, byte min = 0, byte max = byte.MaxValue)
    {
        byte r = (byte)(R == 0 ? 0 :
            Math.Min(Math.Max(min, R * factor), max));

        byte g = (byte)(G == 0 ? 0 :
            Math.Min(Math.Max(min, G * factor), max));

        byte b = (byte)(B == 0 ? 0 :
            Math.Min(Math.Max(min, B * factor), max));
        return Color.FromArgb(A, r, g, b);
    }

    /// <summary>
    /// Returns the integer representation of the color.
    /// </summary>
    /// <returns>
    /// The integer representation of the color.
    /// </returns>
    public uint ToUint32()
    {
        return ((uint)A << 24) | ((uint)R << 16) | ((uint)G << 8) | (uint)B;
    }

    /// <summary>
    /// Check if two colors are equal.
    /// </summary>
    public bool Equals(Color other)
    {
        return A == other.A && R == other.R && G == other.G && B == other.B;
    }

    public override bool Equals(object obj)
    {
        return obj is Color other && Equals(other);
    }

    public override int GetHashCode()
    {
        unchecked
        {
            int hashCode = A.GetHashCode();
            hashCode = (hashCode * 397) ^ R.GetHashCode();
            hashCode = (hashCode * 397) ^ G.GetHashCode();
            hashCode = (hashCode * 397) ^ B.GetHashCode();
            return hashCode;
        }
    }

    public static bool operator ==(Color left, Color right)
    {
        return left.Equals(right);
    }

    public static bool operator !=(Color left, Color right)
    {
        return !left.Equals(right);
    }
}