public void ApplyColorOperation(ColorOperation colorOperation, Color appliedColor)
{
Color baseColor;
switch (colorOperation)
{
case ColorOperation.Add:
for (int x = 0; x < Width; x++)
{
for (int y = 0; y < height; y++)
{
baseColor = GetPixelColor(x, y);
#if FRB_MDX
// System.Drawing.Color doesn't have setters for A, R, G, B
// so we have to do it a more inefficient way in FRB MDX
Color combinedColor = Color.FromArgb(
baseColor.A,
(byte)System.Math.Min((baseColor.R + appliedColor.R), 255),
(byte)System.Math.Min((baseColor.G + appliedColor.G), 255),
(byte)System.Math.Min((baseColor.B + appliedColor.B), 255));
baseColor = combinedColor;
#elif XNA4
baseColor.R = (byte)(System.Math.Min((baseColor.R + appliedColor.R), 255) * baseColor.A / 255);
baseColor.G = (byte)(System.Math.Min((baseColor.G + appliedColor.G), 255) * baseColor.A / 255);
baseColor.B = (byte)(System.Math.Min((baseColor.B + appliedColor.B), 255) * baseColor.A / 255);
#else
baseColor.R = (byte)System.Math.Min((baseColor.R + appliedColor.R), 255);
baseColor.G = (byte)System.Math.Min((baseColor.G + appliedColor.G), 255);
baseColor.B = (byte)System.Math.Min((baseColor.B + appliedColor.B), 255);
#endif
SetPixel(x, y, baseColor);
}
}
break;
case ColorOperation.Modulate:
// Justin Johnson - May 15, 2012 - pre-multiply so we don't calculate every iteration (Justin 5/15/2012)
float red = appliedColor.R / 255f;
float green = appliedColor.G / 255f;
float blue = appliedColor.B / 255f;
for (int x = 0; x < Width; x++)
{
for (int y = 0; y < height; y++)
{
baseColor = GetPixelColor(x, y);
#if FRB_MDX
// System.Drawing.Color doesn't have setters for A, R, G, B
// so we have to do it a more inefficient way in FRB MDX
Color combinedColor = Color.FromArgb(
baseColor.A,
(byte)(baseColor.R * red),
(byte)(baseColor.G * green),
(byte)(baseColor.B * blue));
baseColor = combinedColor;
#else
baseColor.R = (byte)(baseColor.R * red);
baseColor.G = (byte)(baseColor.G * green);
baseColor.B = (byte)(baseColor.B * blue);
#endif
SetPixel(x, y, baseColor);
}
}
break;
case ColorOperation.Texture:
// no-op
break;
default:
throw new NotImplementedException();
}
}