mirror of
https://github.com/claunia/cuetools.net.git
synced 2025-12-16 18:14:25 +00:00
285 lines
7.5 KiB
C#
285 lines
7.5 KiB
C#
|
|
using System;
|
||
|
|
using System.ComponentModel;
|
||
|
|
using System.Drawing;
|
||
|
|
|
||
|
|
namespace ProgressODoom {
|
||
|
|
/// <summary></summary>
|
||
|
|
public class ColorUtility {
|
||
|
|
static ColorUtility() {
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary></summary>
|
||
|
|
/// <param name="c"></param>
|
||
|
|
/// <returns></returns>
|
||
|
|
public static Color ReverseColor(Color c) {
|
||
|
|
return Color.FromArgb(ReverseInt(c.R), ReverseInt(c.G), ReverseInt(c.B));
|
||
|
|
}
|
||
|
|
|
||
|
|
private static int ReverseInt(int x) {
|
||
|
|
int val = x - 255;
|
||
|
|
if (val < 0) { val = val * -1; }
|
||
|
|
return val;
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary></summary>
|
||
|
|
/// <param name="c"></param>
|
||
|
|
/// <returns></returns>
|
||
|
|
public static string ToHexString(Color c) {
|
||
|
|
string hex = string.Empty;
|
||
|
|
hex += DoHex(c.R);
|
||
|
|
hex += DoHex(c.G);
|
||
|
|
hex += DoHex(c.B);
|
||
|
|
return "#" + hex;
|
||
|
|
}
|
||
|
|
|
||
|
|
private static string DoHex(int xor) {
|
||
|
|
string hex = xor.ToString("x");
|
||
|
|
if (xor < 16) {
|
||
|
|
hex = "0" + hex;
|
||
|
|
}
|
||
|
|
if (xor == 0) {
|
||
|
|
hex = "00";
|
||
|
|
}
|
||
|
|
return hex.ToUpper();
|
||
|
|
}
|
||
|
|
|
||
|
|
private static int DeHex(string input) {
|
||
|
|
int val;
|
||
|
|
int result = 0;
|
||
|
|
for (int i = 0; i < input.Length; i++) {
|
||
|
|
string chunk = input.Substring(i, 1).ToUpper();
|
||
|
|
switch (chunk) {
|
||
|
|
case "A":
|
||
|
|
val = 10; break;
|
||
|
|
case "B":
|
||
|
|
val = 11; break;
|
||
|
|
case "C":
|
||
|
|
val = 12; break;
|
||
|
|
case "D":
|
||
|
|
val = 13; break;
|
||
|
|
case "E":
|
||
|
|
val = 14; break;
|
||
|
|
case "F":
|
||
|
|
val = 15; break;
|
||
|
|
default:
|
||
|
|
val = int.Parse(chunk); break;
|
||
|
|
}
|
||
|
|
if (i == 0) {
|
||
|
|
result += val * 16;
|
||
|
|
} else {
|
||
|
|
result += val;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return result;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// System.Drawing.Drawing2D.ColorBlend
|
||
|
|
/// <summary></summary>
|
||
|
|
public class ColorBlender {
|
||
|
|
private Color colorleft;
|
||
|
|
private Color colorright;
|
||
|
|
private int steps;
|
||
|
|
|
||
|
|
private float step;
|
||
|
|
private float stepsize;
|
||
|
|
|
||
|
|
/// <summary></summary>
|
||
|
|
/// <param name="numberofsteps"></param>
|
||
|
|
/// <param name="one"></param>
|
||
|
|
/// <param name="two"></param>
|
||
|
|
public ColorBlender(int numberofsteps, Color one, Color two) {
|
||
|
|
steps = numberofsteps;
|
||
|
|
colorleft = one;
|
||
|
|
colorright = two;
|
||
|
|
stepsize = 1.0f / Convert.ToSingle(steps);
|
||
|
|
step = 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary></summary>
|
||
|
|
/// <returns></returns>
|
||
|
|
public bool HasNext() {
|
||
|
|
return step < 1;
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary></summary>
|
||
|
|
/// <returns></returns>
|
||
|
|
public Color Next() {
|
||
|
|
if (!HasNext()) { throw new Exception("Past threshold."); }
|
||
|
|
step += stepsize;
|
||
|
|
return Morph(step, colorleft, colorright);
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary></summary>
|
||
|
|
/// <param name="ratio"></param>
|
||
|
|
/// <param name="c1"></param>
|
||
|
|
/// <param name="c2"></param>
|
||
|
|
/// <returns></returns>
|
||
|
|
public Color Morph(float ratio, Color c1, Color c2) {
|
||
|
|
int r = (int)(c1.R + ratio * (c2.R - c1.R));
|
||
|
|
int g = (int)(c1.G + ratio * (c2.G - c1.G));
|
||
|
|
int b = (int)(c1.B + ratio * (c2.B - c1.B));
|
||
|
|
return Color.FromArgb(r, g, b);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary></summary>
|
||
|
|
public struct ColorRange {
|
||
|
|
/// <summary></summary>
|
||
|
|
public Color Light;
|
||
|
|
/// <summary></summary>
|
||
|
|
public Color Lighter;
|
||
|
|
/// <summary></summary>
|
||
|
|
public Color BaseColor;
|
||
|
|
/// <summary></summary>
|
||
|
|
public Color Dark;
|
||
|
|
/// <summary></summary>
|
||
|
|
public Color Darker;
|
||
|
|
|
||
|
|
/// <summary></summary>
|
||
|
|
/// <param name="color"></param>
|
||
|
|
public ColorRange(Color color) {
|
||
|
|
BaseColor = color;
|
||
|
|
Light = ColorRange.Tint(0.6f, color);
|
||
|
|
Lighter = ColorRange.Tint(0.3f, color);
|
||
|
|
Dark = ColorRange.Shade(0.8f, color);
|
||
|
|
Darker = ColorRange.Shade(0.6f, color);
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary></summary>
|
||
|
|
/// <param name="color"></param>
|
||
|
|
/// <param name="lightratio"></param>
|
||
|
|
/// <param name="lighterratio"></param>
|
||
|
|
public ColorRange(Color color, float lightratio, float lighterratio) {
|
||
|
|
BaseColor = color;
|
||
|
|
Light = ColorRange.Tint(lightratio, color);
|
||
|
|
Lighter = ColorRange.Tint(lighterratio, color);
|
||
|
|
Dark = ColorRange.Shade(lightratio, color);
|
||
|
|
Darker = ColorRange.Shade(lighterratio, color);
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary></summary>
|
||
|
|
/// <param name="color"></param>
|
||
|
|
/// <param name="lightratio"></param>
|
||
|
|
/// <param name="lighterratio"></param>
|
||
|
|
/// <param name="darkratio"></param>
|
||
|
|
/// <param name="darkerratio"></param>
|
||
|
|
public ColorRange(Color color, float lightratio, float lighterratio, float darkratio, float darkerratio) {
|
||
|
|
BaseColor = color;
|
||
|
|
Light = ColorRange.Tint(lightratio, color);
|
||
|
|
Lighter = ColorRange.Tint(lighterratio, color);
|
||
|
|
Dark = ColorRange.Shade(darkratio, color);
|
||
|
|
Darker = ColorRange.Shade(darkerratio, color);
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary></summary>
|
||
|
|
/// <param name="ratio"></param>
|
||
|
|
/// <param name="c1"></param>
|
||
|
|
/// <returns></returns>
|
||
|
|
public static Color Tint(float ratio, Color c1) {
|
||
|
|
return Morph(ratio, Color.White, c1);
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary></summary>
|
||
|
|
/// <param name="ratio"></param>
|
||
|
|
/// <param name="c1"></param>
|
||
|
|
/// <returns></returns>
|
||
|
|
public static Color Shade(float ratio, Color c1) {
|
||
|
|
return Morph(ratio, Color.Black, c1);
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary></summary>
|
||
|
|
/// <param name="ratio"></param>
|
||
|
|
/// <param name="c1"></param>
|
||
|
|
/// <param name="c2"></param>
|
||
|
|
/// <returns></returns>
|
||
|
|
public static Color Morph(float ratio, Color c1, Color c2) {
|
||
|
|
int r = (int)(c1.R + ratio * (c2.R - c1.R));
|
||
|
|
int g = (int)(c1.G + ratio * (c2.G - c1.G));
|
||
|
|
int b = (int)(c1.B + ratio * (c2.B - c1.B));
|
||
|
|
return Color.FromArgb(r, g, b);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary></summary>
|
||
|
|
public class ColorSet {
|
||
|
|
private bool shade;
|
||
|
|
private Color color;
|
||
|
|
private float factor;
|
||
|
|
private int colors;
|
||
|
|
private Color[] range;
|
||
|
|
|
||
|
|
/// <summary></summary>
|
||
|
|
/// <param name="shade"></param>
|
||
|
|
/// <param name="color"></param>
|
||
|
|
/// <param name="factor"></param>
|
||
|
|
/// <param name="colors"></param>
|
||
|
|
public ColorSet(bool shade, Color color, float factor, int colors) {
|
||
|
|
if (colors < 1) { throw new ArgumentException("Number of colors must be greater than 0."); }
|
||
|
|
if (factor < 0 || factor > 1) { throw new ArgumentException("Factor must be between 0 and 1."); }
|
||
|
|
this.shade = shade;
|
||
|
|
this.color = color;
|
||
|
|
this.factor = factor;
|
||
|
|
this.colors = colors;
|
||
|
|
Build();
|
||
|
|
}
|
||
|
|
|
||
|
|
private void Build() {
|
||
|
|
this.range = new Color[colors];
|
||
|
|
Color current = color;
|
||
|
|
range[0] = current;
|
||
|
|
for (int i = 1; i < colors; i++) {
|
||
|
|
if (shade) {
|
||
|
|
range[i] = ColorRange.Shade(factor, current);
|
||
|
|
} else {
|
||
|
|
range[i] = ColorRange.Tint(factor, current);
|
||
|
|
}
|
||
|
|
current = range[i];
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary></summary>
|
||
|
|
public Color[] Colors {
|
||
|
|
get { return range; }
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary></summary>
|
||
|
|
public class BlendSet {
|
||
|
|
private Color color1;
|
||
|
|
private Color color2;
|
||
|
|
private float factor;
|
||
|
|
private int colors;
|
||
|
|
private Color[] range;
|
||
|
|
|
||
|
|
/// <summary></summary>
|
||
|
|
/// <param name="one"></param>
|
||
|
|
/// <param name="two"></param>
|
||
|
|
/// <param name="factor"></param>
|
||
|
|
/// <param name="colors"></param>
|
||
|
|
public BlendSet(Color one, Color two, float factor, int colors) {
|
||
|
|
if (colors < 1) { throw new ArgumentException("Number of colors must be greater than 0."); }
|
||
|
|
if (factor < 0 || factor > 1) { throw new ArgumentException("Factor must be between 0 and 1."); }
|
||
|
|
this.color1 = one;
|
||
|
|
this.color2 = two;
|
||
|
|
this.factor = factor;
|
||
|
|
this.colors = colors;
|
||
|
|
Build();
|
||
|
|
}
|
||
|
|
|
||
|
|
private void Build() {
|
||
|
|
this.range = new Color[colors];
|
||
|
|
Color current = color1;
|
||
|
|
range[0] = current;
|
||
|
|
for (int i = 1; i < colors; i++) {
|
||
|
|
range[i] = ColorRange.Morph(factor, current, color2);
|
||
|
|
current = range[i];
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary></summary>
|
||
|
|
public Color[] Colors {
|
||
|
|
get { return range; }
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|