Example #1
0
        public void ScaleOpacity(double adjustment, OpacityStyle style)
        {
            if (adjustment == 0)
                return;
            if (style == OpacityStyle.Auto)
                style = adjustment > 0 ? OpacityStyle.Additive : OpacityStyle.MoveEndpoint;

            var lut = new byte[256];
            for (int x = 0; x < 256; x++)
                switch (style)
                {
                    case OpacityStyle.MoveEndpoint:
                        if (adjustment < 0)
                            lut[x] = (byte) (x / (1.0 + -adjustment));
                        else
                            lut[x] = (byte) (255 - (255 - x) / (1.0 + adjustment));
                        break;
                    case OpacityStyle.MoveMidpoint:
                        lut[x] = (byte) (Math.Pow(x / 255.0, adjustment < 0 ? (1 - adjustment) : (1 / (1 + adjustment))) * 255);
                        break;
                    case OpacityStyle.Additive:
                        if (adjustment < 0)
                            lut[x] = (byte) Math.Max(0, 255 - (255 - x) * (1.0 - adjustment));
                        else
                            lut[x] = (byte) Math.Min(255, x * (1.0 + adjustment));
                        break;
                    default:
                        throw new Exception();
                }

            using (UseWrite())
            {
                for (int y = 0; y < Height; y++)
                {
                    byte* ptr = Data + y * Stride + 3;
                    byte* end = ptr + Width * 4;
                    while (ptr < end)
                    {
                        *ptr = lut[*ptr];
                        ptr += 4;
                    }
                }
            }
        }
Example #2
0
        public void ScaleOpacity(double adjustment, OpacityStyle style)
        {
            if (adjustment == 0)
            {
                return;
            }
            if (style == OpacityStyle.Auto)
            {
                style = adjustment > 0 ? OpacityStyle.Additive : OpacityStyle.MoveEndpoint;
            }

            var lut = new byte[256];

            for (int x = 0; x < 256; x++)
            {
                switch (style)
                {
                case OpacityStyle.MoveEndpoint:
                    if (adjustment < 0)
                    {
                        lut[x] = (byte)(x / (1.0 + -adjustment));
                    }
                    else
                    {
                        lut[x] = (byte)(255 - (255 - x) / (1.0 + adjustment));
                    }
                    break;

                case OpacityStyle.MoveMidpoint:
                    lut[x] = (byte)(Math.Pow(x / 255.0, adjustment < 0 ? (1 - adjustment) : (1 / (1 + adjustment))) * 255);
                    break;

                case OpacityStyle.Additive:
                    if (adjustment < 0)
                    {
                        lut[x] = (byte)Math.Max(0, 255 - (255 - x) * (1.0 - adjustment));
                    }
                    else
                    {
                        lut[x] = (byte)Math.Min(255, x * (1.0 + adjustment));
                    }
                    break;

                default:
                    throw new Exception();
                }
            }

            using (UseWrite())
            {
                for (int y = 0; y < Height; y++)
                {
                    byte *ptr = Data + y * Stride + 3;
                    byte *end = ptr + Width * 4;
                    while (ptr < end)
                    {
                        *ptr = lut[*ptr];
                        ptr += 4;
                    }
                }
            }
        }
Example #3
0
 public OpacityEffect()
 {
     Opacity = -1.5;
     Style   = OpacityStyle.Auto;
 }