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; } } } }
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; } } } }
public OpacityEffect() { Opacity = -1.5; Style = OpacityStyle.Auto; }