Pinta.LevelsDialog.UpdateByMask C# (CSharp) Method

UpdateByMask() private method

private UpdateByMask ( ColorBgra before, byte val ) : ColorBgra
before Pinta.Core.ColorBgra
val byte
return Pinta.Core.ColorBgra
        private ColorBgra UpdateByMask(ColorBgra before, byte val)
        {
            ColorBgra after = before;
            int average = -1, oldaverage = -1;

            if (!(mask [0] || mask [1] || mask [2])) {
                return before;
            }

            do {
                float factor;

                oldaverage = average;
                average = MaskAvg (after);

                if (average == 0) {
                    break;
                }
                factor = (float)val / average;

                for (int c = 0; c < 3; c++) {
                    if (mask [c]) {
                        after [c] = (byte)Utility.ClampToByte (after [c] * factor);
                    }
                }
            } while (average != val && oldaverage != average);

            while (average != val) {
                average = MaskAvg (after);
                int diff = val - average;

                for (int c = 0; c < 3; c++) {
                    if (mask [c]) {
                        after [c] = (byte)Utility.ClampToByte(after [c] + diff);
                    }
                }
            }

            after.A = 255;
            return after;
        }