/* func */ public void Add(SpriteInfo spriteInfo, byte[] binData) { if (binData is null) { throw new ArgumentNullException(nameof(binData)); } if (binData.Length < spriteInfo.ColorDataEndPosition || spriteInfo.ColorDataEndPosition > int.MaxValue) { throw new ArgumentException(nameof(binData)); } if (SpriteColorData.ContainsKey(spriteInfo)) { SpriteColorData.Remove(spriteInfo); } JPColor[,] colorData = new JPColor[spriteInfo.Width, spriteInfo.Height]; long startPosition = spriteInfo.ColorDataStartPosition; int startIndex = (int)startPosition; for (int y = 0; y < spriteInfo.Height; y++) { for (int x = 0; x < spriteInfo.Width; x++) { colorData[x, y] = new JPColor(binData, startIndex); startIndex += JPColor.PreJPColorDataSize; } } SpriteColorData.Add(spriteInfo, colorData); }
protected virtual Point[] GetEffectiveArea() { List <Point> result = new List <Point>(); IEnumerable <Point> enumPoints; int count = EffectSpriteColor.Length; if (count < ZipCount) { enumPoints = ShiftPosition.EnumIt(SpriteColorSize, Point.One, ShiftPositionPropensity.LineByLine); } else if (count < ZipCount * 3) { enumPoints = ShiftPosition.EnumIt(SpriteColorSize, Point.One, ShiftPositionPropensity.Random512); } else if (count < ZipCount * 6) { enumPoints = ShiftPosition.EnumIt(SpriteColorSize, Point.One, ShiftPositionPropensity.Interval2); } else { enumPoints = ShiftPosition.EnumIt(SpriteColorSize, Point.One, ShiftPositionPropensity.Interval3); } foreach (Point enumPoint in enumPoints) { JPColor enumPointColor = SpriteColor[enumPoint.X, enumPoint.Y]; if (enumPointColor.A > 0.25) { result.Add(enumPoint); } } return(result.ToArray()); }
public virtual void TryGetPreferredPosition() { Check(); PreferredPosition.Clear(); Point spritetSize = SpriteColorSize; Value[,] valueMap = new Value[spritetSize.X, spritetSize.Y]; EffectiveArea = GetEffectiveArea(); foreach (Point point in GetShiftPosition()) { for (int index = 0; index < EffectiveArea.Length; index++) { Point selectPoint = EffectiveArea[index]; JPColor spriteColor = SpriteColor[selectPoint.X, selectPoint.Y]; JPColor effectColor = EffectSpriteColor[point.X + selectPoint.X, point.Y + selectPoint.Y]; valueMap[selectPoint.X, selectPoint.Y] = GetDeltaValue(effectColor, spriteColor); } if (ValueMapIsBetter(valueMap, out float averageValue)) { PreferredPosition.Add(new WeightedPoint(point, averageValue)); } } #if DEBUG && MVC && !PARALLELMODE System.Text.StringBuilder builder = new System.Text.StringBuilder(); foreach (WeightedPoint weightedPoint in PreferredPosition) { builder.AppendLine($"{nameof(WeightedPoint)} : {weightedPoint}"); } Log.WriteData(null, $"ColorMatch.TryGetPreferredPosition, PreferredPosition : {PreferredPosition.Count}", builder.ToString()); #endif }
public virtual void TryGetNearlyPreferredPosition(int distance) { Check(); Point spriteSize = SpriteColorSize; HashSet <Point> points = new HashSet <Point>(); foreach (WeightedPoint weightedPoint in PreferredPosition) { foreach (Point point in ShiftPosition.EnumItNearly(EffectSpriteColorSize, spriteSize, weightedPoint.Position, distance)) { points.Add(point); } } PreferredPosition.Clear(); EffectiveArea = GetEffectiveArea(); Value[,] valueMap = new Value[spriteSize.X, spriteSize.Y]; foreach (Point point in points) { foreach (Point selectPoint in EffectiveArea) { JPColor effectColor = EffectSpriteColor[point.X + selectPoint.X, point.Y + selectPoint.Y]; JPColor spriteColor = SpriteColor[selectPoint.X, selectPoint.Y]; valueMap[selectPoint.X, selectPoint.Y] = GetDeltaValue(effectColor, spriteColor); } if (ValueMapIsBetter(valueMap, out float averageValue)) { PreferredPosition.Add(new WeightedPoint(point, averageValue)); } } }
/* func */ protected override float GetDeltaValue(JPColor effectColor, JPColor spriteColor) => JPColor.RGBADelta(effectColor, spriteColor).SqrMagnitude;
/* func */ protected override float GetDeltaValue(JPColor effectColor, JPColor spriteColor) => JPColor.HDelta(effectColor, spriteColor);
protected abstract Value GetDeltaValue(JPColor effectColor, JPColor spriteColor);