Browse Source

Avoid casting WebpEncodingMethod

pull/1552/head
Brian Popow 5 years ago
parent
commit
b9c67cebef
  1. 4
      src/ImageSharp/Formats/Webp/Lossless/Vp8LEncoder.cs
  2. 18
      src/ImageSharp/Formats/Webp/Lossy/Vp8Encoder.cs

4
src/ImageSharp/Formats/Webp/Lossless/Vp8LEncoder.cs

@ -105,7 +105,7 @@ namespace SixLabors.ImageSharp.Formats.Webp.Lossless
this.memoryAllocator = memoryAllocator; this.memoryAllocator = memoryAllocator;
this.configuration = configuration; this.configuration = configuration;
this.quality = Numerics.Clamp(quality, 0, 100); this.quality = Numerics.Clamp(quality, 0, 100);
this.method = (WebpEncodingMethod)Numerics.Clamp((int)method, 0, 6); this.method = method;
this.exact = exact; this.exact = exact;
this.nearLossless = nearLossless; this.nearLossless = nearLossless;
this.nearLosslessQuality = Numerics.Clamp(nearLosslessQuality, 0, 100); this.nearLosslessQuality = Numerics.Clamp(nearLosslessQuality, 0, 100);
@ -1689,7 +1689,7 @@ namespace SixLabors.ImageSharp.Formats.Webp.Lossless
[MethodImpl(InliningOptions.ShortMethod)] [MethodImpl(InliningOptions.ShortMethod)]
private static int GetTransformBits(WebpEncodingMethod method, int histoBits) private static int GetTransformBits(WebpEncodingMethod method, int histoBits)
{ {
int maxTransformBits = (int)method < 4 ? 6 : (int)method > 4 ? 4 : 5; int maxTransformBits = (int)method < 4 ? 6 : method > WebpEncodingMethod.Level4 ? 4 : 5;
int res = histoBits > maxTransformBits ? maxTransformBits : histoBits; int res = histoBits > maxTransformBits ? maxTransformBits : histoBits;
return res; return res;
} }

18
src/ImageSharp/Formats/Webp/Lossy/Vp8Encoder.cs

@ -115,13 +115,13 @@ namespace SixLabors.ImageSharp.Formats.Webp.Lossy
this.Width = width; this.Width = width;
this.Height = height; this.Height = height;
this.quality = Numerics.Clamp(quality, 0, 100); this.quality = Numerics.Clamp(quality, 0, 100);
this.method = (WebpEncodingMethod)Numerics.Clamp((int)method, 0, 6); this.method = method;
this.entropyPasses = Numerics.Clamp(entropyPasses, 1, 10); this.entropyPasses = Numerics.Clamp(entropyPasses, 1, 10);
this.filterStrength = Numerics.Clamp(filterStrength, 0, 100); this.filterStrength = Numerics.Clamp(filterStrength, 0, 100);
this.spatialNoiseShaping = Numerics.Clamp(spatialNoiseShaping, 0, 100); this.spatialNoiseShaping = Numerics.Clamp(spatialNoiseShaping, 0, 100);
this.rdOptLevel = method is WebpEncodingMethod.BestQuality ? Vp8RdLevel.RdOptTrellisAll this.rdOptLevel = method is WebpEncodingMethod.BestQuality ? Vp8RdLevel.RdOptTrellisAll
: (int)method >= 5 ? Vp8RdLevel.RdOptTrellis : method >= WebpEncodingMethod.Level5 ? Vp8RdLevel.RdOptTrellis
: (int)method >= 3 ? Vp8RdLevel.RdOptBasic : method >= WebpEncodingMethod.Level3 ? Vp8RdLevel.RdOptBasic
: Vp8RdLevel.RdOptNone; : Vp8RdLevel.RdOptNone;
int pixelCount = width * height; int pixelCount = width * height;
@ -371,7 +371,7 @@ namespace SixLabors.ImageSharp.Formats.Webp.Lossy
bool doSearch = targetSize > 0 || targetPsnr > 0; bool doSearch = targetSize > 0 || targetPsnr > 0;
bool fastProbe = (this.method == 0 || this.method == WebpEncodingMethod.Level3) && !doSearch; bool fastProbe = (this.method == 0 || this.method == WebpEncodingMethod.Level3) && !doSearch;
int numPassLeft = this.entropyPasses; int numPassLeft = this.entropyPasses;
Vp8RdLevel rdOpt = (int)this.method >= 3 || doSearch ? Vp8RdLevel.RdOptBasic : Vp8RdLevel.RdOptNone; Vp8RdLevel rdOpt = this.method >= WebpEncodingMethod.Level3 || doSearch ? Vp8RdLevel.RdOptBasic : Vp8RdLevel.RdOptNone;
int nbMbs = this.Mbw * this.Mbh; int nbMbs = this.Mbw * this.Mbh;
var stats = new PassStats(targetSize, targetPsnr, QMin, QMax, this.quality); var stats = new PassStats(targetSize, targetPsnr, QMin, QMax, this.quality);
@ -799,7 +799,7 @@ namespace SixLabors.ImageSharp.Formats.Webp.Lossy
private void SetupMatrices(Vp8SegmentInfo[] dqm) private void SetupMatrices(Vp8SegmentInfo[] dqm)
{ {
int tlambdaScale = (int)this.method >= 4 ? this.spatialNoiseShaping : 0; int tlambdaScale = this.method >= WebpEncodingMethod.Default ? this.spatialNoiseShaping : 0;
for (int i = 0; i < dqm.Length; i++) for (int i = 0; i < dqm.Length; i++)
{ {
Vp8SegmentInfo m = dqm[i]; Vp8SegmentInfo m = dqm[i];
@ -870,14 +870,14 @@ namespace SixLabors.ImageSharp.Formats.Webp.Lossy
it.SetSegment(0); // default segment, spec-wise. it.SetSegment(0); // default segment, spec-wise.
int bestAlpha; int bestAlpha;
if ((int)this.method <= 1) if (this.method <= WebpEncodingMethod.Level1)
{ {
bestAlpha = it.FastMbAnalyze(this.quality); bestAlpha = it.FastMbAnalyze(this.quality);
} }
else else
{ {
bestAlpha = it.MbAnalyzeBestIntra16Mode(); bestAlpha = it.MbAnalyzeBestIntra16Mode();
if ((int)this.method >= 5) if (this.method >= WebpEncodingMethod.Level5)
{ {
// We go and make a fast decision for intra4/intra16. // We go and make a fast decision for intra4/intra16.
// It's usually not a good and definitive pick, but helps seeding the stats about level bit-cost. // It's usually not a good and definitive pick, but helps seeding the stats about level bit-cost.
@ -908,7 +908,7 @@ namespace SixLabors.ImageSharp.Formats.Webp.Lossy
if (rdOpt > Vp8RdLevel.RdOptNone) if (rdOpt > Vp8RdLevel.RdOptNone)
{ {
QuantEnc.PickBestIntra16(it, ref rd, this.SegmentInfos, this.Proba); QuantEnc.PickBestIntra16(it, ref rd, this.SegmentInfos, this.Proba);
if ((int)this.method >= 2) if (this.method >= WebpEncodingMethod.Level2)
{ {
QuantEnc.PickBestIntra4(it, ref rd, this.SegmentInfos, this.Proba, this.maxI4HeaderBits); QuantEnc.PickBestIntra4(it, ref rd, this.SegmentInfos, this.Proba, this.maxI4HeaderBits);
} }
@ -921,7 +921,7 @@ namespace SixLabors.ImageSharp.Formats.Webp.Lossy
// For method >= 2, pick the best intra4/intra16 based on SSE (~tad slower). // For method >= 2, pick the best intra4/intra16 based on SSE (~tad slower).
// For method <= 1, we don't re-examine the decision but just go ahead with // For method <= 1, we don't re-examine the decision but just go ahead with
// quantization/reconstruction. // quantization/reconstruction.
QuantEnc.RefineUsingDistortion(it, this.SegmentInfos, rd, (int)this.method >= 2, (int)this.method >= 1, this.MbHeaderLimit); QuantEnc.RefineUsingDistortion(it, this.SegmentInfos, rd, this.method >= WebpEncodingMethod.Level2, this.method >= WebpEncodingMethod.Level1, this.MbHeaderLimit);
} }
bool isSkipped = rd.Nz == 0; bool isSkipped = rd.Nz == 0;

Loading…
Cancel
Save