/* 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);
        }
예제 #2
0
        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());
        }
예제 #3
0
        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
        }
예제 #4
0
        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));
                }
            }
        }
예제 #5
0
 /* func */
 protected override float GetDeltaValue(JPColor effectColor, JPColor spriteColor) =>
 JPColor.RGBADelta(effectColor, spriteColor).SqrMagnitude;
예제 #6
0
 /* func */
 protected override float GetDeltaValue(JPColor effectColor, JPColor spriteColor) =>
 JPColor.HDelta(effectColor, spriteColor);
예제 #7
0
 protected abstract Value GetDeltaValue(JPColor effectColor, JPColor spriteColor);