Skip to content

Commit 0980f53

Browse files
committed
Added ScaleFromDouble to the quantum scalers.
1 parent 084c9cc commit 0980f53

File tree

12 files changed

+140
-44
lines changed

12 files changed

+140
-44
lines changed

src/Magick.NET.Core/Scaler/ByteQuantumScaler.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// Copyright Dirk Lemstra https://github.com/dlemstra/Magick.NET.
22
// Licensed under the Apache License, Version 2.0.
33

4+
using System;
45
using System.Runtime.CompilerServices;
56

67
namespace ImageMagick;
@@ -11,6 +12,10 @@ internal sealed class ByteQuantumScaler : IQuantumScaler<byte>
1112
public byte ScaleFromByte(byte value)
1213
=> value;
1314

15+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
16+
public byte ScaleFromDouble(double value)
17+
=> (byte)Math.Min(Math.Max(0.0, value * byte.MaxValue), byte.MaxValue);
18+
1419
[MethodImpl(MethodImplOptions.AggressiveInlining)]
1520
public byte ScaleFromUnsignedShort(ushort value)
1621
=> (byte)((value + 128U) / 257U);

src/Magick.NET.Core/Scaler/FloatQuantumScaler.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// Copyright Dirk Lemstra https://github.com/dlemstra/Magick.NET.
22
// Licensed under the Apache License, Version 2.0.
33

4+
using System;
45
using System.Runtime.CompilerServices;
56

67
namespace ImageMagick;
@@ -11,6 +12,10 @@ internal sealed class FloatQuantumScaler : IQuantumScaler<float>
1112
public float ScaleFromByte(byte value)
1213
=> 257.0f * value;
1314

15+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
16+
public float ScaleFromDouble(double value)
17+
=> (float)Math.Min(Math.Max(0.0, value * ushort.MaxValue), ushort.MaxValue);
18+
1419
[MethodImpl(MethodImplOptions.AggressiveInlining)]
1520
public float ScaleFromUnsignedShort(ushort value)
1621
=> value;

src/Magick.NET.Core/Scaler/IQuantumScaler{TQuantumType}.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,13 @@ public interface IQuantumScaler<TQuantumType>
1919
/// <returns>The value scaled to a quantum type.</returns>
2020
TQuantumType ScaleFromByte(byte value);
2121

22+
/// <summary>
23+
/// Scales the specified value to a quantum type.
24+
/// </summary>
25+
/// <param name="value">The value to scale.</param>
26+
/// <returns>The value scaled to a quantum type.</returns>
27+
TQuantumType ScaleFromDouble(double value);
28+
2229
/// <summary>
2330
/// Scales the specified value to a quantum type.
2431
/// </summary>

src/Magick.NET.Core/Scaler/UnsignedShortQuantumScaler.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// Copyright Dirk Lemstra https://github.com/dlemstra/Magick.NET.
22
// Licensed under the Apache License, Version 2.0.
33

4+
using System;
45
using System.Runtime.CompilerServices;
56

67
namespace ImageMagick;
@@ -11,6 +12,10 @@ internal sealed class UnsignedShortQuantumScaler : IQuantumScaler<ushort>
1112
public ushort ScaleFromByte(byte value)
1213
=> (ushort)(value * 257);
1314

15+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
16+
public ushort ScaleFromDouble(double value)
17+
=> (ushort)Math.Min(Math.Max(0.0, value * ushort.MaxValue), ushort.MaxValue);
18+
1419
[MethodImpl(MethodImplOptions.AggressiveInlining)]
1520
public ushort ScaleFromUnsignedShort(ushort value)
1621
=> value;

src/Magick.NET/Colors/ColorGray.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,8 @@ public double Shade
8484
/// </summary>
8585
protected override void UpdateColor()
8686
{
87-
var gray = Quantum.ScaleToQuantum(_shade);
87+
var quantum = QuantumScaler.Create<QuantumType>();
88+
var gray = quantum.ScaleFromDouble(_shade);
8889
Color.R = gray;
8990
Color.G = gray;
9091
Color.B = gray;

src/Magick.NET/Colors/ColorHSL.cs

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -91,38 +91,39 @@ protected override void UpdateColor()
9191
h -= 360.0 * Math.Floor(h / 360.0);
9292
h /= 60.0;
9393
var x = c * (1.0 - Math.Abs(h - (2.0 * Math.Floor(h / 2.0)) - 1.0));
94+
var quantum = QuantumScaler.Create<QuantumType>();
9495
switch ((int)Math.Floor(h))
9596
{
9697
case 0:
9798
default:
98-
Color.R = Quantum.ScaleToQuantum(min + c);
99-
Color.G = Quantum.ScaleToQuantum(min + x);
100-
Color.B = Quantum.ScaleToQuantum(min);
99+
Color.R = quantum.ScaleFromDouble(min + c);
100+
Color.G = quantum.ScaleFromDouble(min + x);
101+
Color.B = quantum.ScaleFromDouble(min);
101102
break;
102103
case 1:
103-
Color.R = Quantum.ScaleToQuantum(min + x);
104-
Color.G = Quantum.ScaleToQuantum(min + c);
105-
Color.B = Quantum.ScaleToQuantum(min);
104+
Color.R = quantum.ScaleFromDouble(min + x);
105+
Color.G = quantum.ScaleFromDouble(min + c);
106+
Color.B = quantum.ScaleFromDouble(min);
106107
break;
107108
case 2:
108-
Color.R = Quantum.ScaleToQuantum(min);
109-
Color.G = Quantum.ScaleToQuantum(min + c);
110-
Color.B = Quantum.ScaleToQuantum(min + x);
109+
Color.R = quantum.ScaleFromDouble(min);
110+
Color.G = quantum.ScaleFromDouble(min + c);
111+
Color.B = quantum.ScaleFromDouble(min + x);
111112
break;
112113
case 3:
113-
Color.R = Quantum.ScaleToQuantum(min);
114-
Color.G = Quantum.ScaleToQuantum(min + x);
115-
Color.B = Quantum.ScaleToQuantum(min + c);
114+
Color.R = quantum.ScaleFromDouble(min);
115+
Color.G = quantum.ScaleFromDouble(min + x);
116+
Color.B = quantum.ScaleFromDouble(min + c);
116117
break;
117118
case 4:
118-
Color.R = Quantum.ScaleToQuantum(min + x);
119-
Color.G = Quantum.ScaleToQuantum(min);
120-
Color.B = Quantum.ScaleToQuantum(min + c);
119+
Color.R = quantum.ScaleFromDouble(min + x);
120+
Color.G = quantum.ScaleFromDouble(min);
121+
Color.B = quantum.ScaleFromDouble(min + c);
121122
break;
122123
case 5:
123-
Color.R = Quantum.ScaleToQuantum(min + c);
124-
Color.G = Quantum.ScaleToQuantum(min);
125-
Color.B = Quantum.ScaleToQuantum(min + x);
124+
Color.R = quantum.ScaleFromDouble(min + c);
125+
Color.G = quantum.ScaleFromDouble(min);
126+
Color.B = quantum.ScaleFromDouble(min + x);
126127
break;
127128
}
128129
}

src/Magick.NET/Colors/ColorHSV.cs

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,11 @@ public void HueShift(double degrees)
9696
/// </summary>
9797
protected override void UpdateColor()
9898
{
99+
var quantum = QuantumScaler.Create<QuantumType>();
100+
99101
if (Math.Abs(Saturation) < double.Epsilon)
100102
{
101-
Color.R = Color.G = Color.B = Quantum.ScaleToQuantum(Value);
103+
Color.R = Color.G = Color.B = quantum.ScaleFromDouble(Value);
102104
return;
103105
}
104106

@@ -111,34 +113,34 @@ protected override void UpdateColor()
111113
{
112114
case 0:
113115
default:
114-
Color.R = Quantum.ScaleToQuantum(Value);
115-
Color.G = Quantum.ScaleToQuantum(t);
116-
Color.B = Quantum.ScaleToQuantum(p);
116+
Color.R = quantum.ScaleFromDouble(Value);
117+
Color.G = quantum.ScaleFromDouble(t);
118+
Color.B = quantum.ScaleFromDouble(p);
117119
break;
118120
case 1:
119-
Color.R = Quantum.ScaleToQuantum(q);
120-
Color.G = Quantum.ScaleToQuantum(Value);
121-
Color.B = Quantum.ScaleToQuantum(p);
121+
Color.R = quantum.ScaleFromDouble(q);
122+
Color.G = quantum.ScaleFromDouble(Value);
123+
Color.B = quantum.ScaleFromDouble(p);
122124
break;
123125
case 2:
124-
Color.R = Quantum.ScaleToQuantum(p);
125-
Color.G = Quantum.ScaleToQuantum(Value);
126-
Color.B = Quantum.ScaleToQuantum(t);
126+
Color.R = quantum.ScaleFromDouble(p);
127+
Color.G = quantum.ScaleFromDouble(Value);
128+
Color.B = quantum.ScaleFromDouble(t);
127129
break;
128130
case 3:
129-
Color.R = Quantum.ScaleToQuantum(p);
130-
Color.G = Quantum.ScaleToQuantum(q);
131-
Color.B = Quantum.ScaleToQuantum(Value);
131+
Color.R = quantum.ScaleFromDouble(p);
132+
Color.G = quantum.ScaleFromDouble(q);
133+
Color.B = quantum.ScaleFromDouble(Value);
132134
break;
133135
case 4:
134-
Color.R = Quantum.ScaleToQuantum(t);
135-
Color.G = Quantum.ScaleToQuantum(p);
136-
Color.B = Quantum.ScaleToQuantum(Value);
136+
Color.R = quantum.ScaleFromDouble(t);
137+
Color.G = quantum.ScaleFromDouble(p);
138+
Color.B = quantum.ScaleFromDouble(Value);
137139
break;
138140
case 5:
139-
Color.R = Quantum.ScaleToQuantum(Value);
140-
Color.G = Quantum.ScaleToQuantum(p);
141-
Color.B = Quantum.ScaleToQuantum(q);
141+
Color.R = quantum.ScaleFromDouble(Value);
142+
Color.G = quantum.ScaleFromDouble(p);
143+
Color.B = quantum.ScaleFromDouble(q);
142144
break;
143145
}
144146
}

src/Magick.NET/Colors/ColorYUV.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,9 @@ private ColorYUV(IMagickColor<QuantumType> color)
8181
/// </summary>
8282
protected override void UpdateColor()
8383
{
84-
Color.R = Quantum.ScaleToQuantum(Y - (3.945707070708279e-05 * (U - 0.5)) + (1.1398279671717170825 * (V - 0.5)));
85-
Color.G = Quantum.ScaleToQuantum(Y - (0.3946101641414141437 * (U - 0.5)) - (0.5805003156565656797 * (V - 0.5)));
86-
Color.B = Quantum.ScaleToQuantum(Y + (2.0319996843434342537 * (U - 0.5)) - (4.813762626262513e-04 * (V - 0.5)));
84+
var quantum = QuantumScaler.Create<QuantumType>();
85+
Color.R = quantum.ScaleFromDouble(Y - (3.945707070708279e-05 * (U - 0.5)) + (1.1398279671717170825 * (V - 0.5)));
86+
Color.G = quantum.ScaleFromDouble(Y - (0.3946101641414141437 * (U - 0.5)) - (0.5805003156565656797 * (V - 0.5)));
87+
Color.B = quantum.ScaleFromDouble(Y + (2.0319996843434342537 * (U - 0.5)) - (4.813762626262513e-04 * (V - 0.5)));
8788
}
8889
}

src/Magick.NET/Quantum.cs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,4 @@ internal static QuantumType ConvertFromInteger(int value)
6767

6868
return (QuantumType)value;
6969
}
70-
71-
internal static QuantumType ScaleToQuantum(double value)
72-
=> (QuantumType)Math.Min(Math.Max(0, value * Max), Max);
7370
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// Copyright Dirk Lemstra https://github.com/dlemstra/Magick.NET.
2+
// Licensed under the Apache License, Version 2.0.
3+
4+
using ImageMagick;
5+
using Xunit;
6+
7+
namespace Magick.NET.Core.Tests;
8+
9+
public partial class ByteQuantumScalerTests
10+
{
11+
public class TheScaleFromDoubleMethod
12+
{
13+
[Theory]
14+
[InlineData(0.0, byte.MinValue)]
15+
[InlineData(1.0, byte.MaxValue)]
16+
public void ShouldScaleDoubleToByte(double input, byte output)
17+
{
18+
var scaler = new ByteQuantumScaler();
19+
var result = scaler.ScaleFromDouble(input);
20+
21+
Assert.Equal(output, result);
22+
}
23+
}
24+
}

0 commit comments

Comments
 (0)