mirror of
https://github.com/claunia/cuetools.net.git
synced 2025-12-16 18:14:25 +00:00
CUERipper revamp
This commit is contained in:
285
ProgressODoom/ColorTools.cs
Normal file
285
ProgressODoom/ColorTools.cs
Normal file
@@ -0,0 +1,285 @@
|
||||
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; }
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user