I am using the Signature control in OpenNETCF. It works great for most everything I need.
However, I need a way invert the signature and load it back in.
It
I might be a little late, but I'm looking at the code right now and here are some points worth noting.
Completely-untested-code Golf:
public void InvertSignature(ref byte[] original,
bool invertHorizontal, bool invertVertical)
{
for (int i = 0; i < original.Length; i += 2)
{
if ((original[i] != 0) && (original[i + 1] != 0))
{
if (invertHorizontal)
{
original[i] = 232 - original[i] - 1;
}
if (invertVertical)
{
original[i + 1] = 64 - original[i + 1] - 1;
}
}
}
}
Or try this version, on the assumption that the first 4 bytes are used to store the width and height of the signature (2 byte short ints for each):
public void InvertSignature(ref byte[] original,
bool invertHorizontal, bool invertVertical)
{
byte w = (byte)BitConverter.ToInt16(original, 0) - 1;
byte h = (byte)BitConverter.ToInt16(original, 2) - 1;
// TO DO: blow up if w or h are > 255
for (int i = 4; i < original.Length; i += 2)
{
if ((original[i] != 0) && (original[i + 1] != 0))
{
if (invertHorizontal)
{
original[i] = w - original[i];
}
if (invertVertical)
{
original[i + 1] = h - original[i + 1];
}
}
}
}
See: Converting OpenNetCF GetSignatureEx to Bitmap on Desktop
Update: Given your description of why you need to invert the signature, it might be easier for you to just invert the ScreenOrientation of your device by 180 degrees (and then back after the customer signs). This way you could also have labels that tell the customer what they're signing - otherwise they're going to be looking at a bunch of upside-down stuff (other than the signature control itself).
To do this, add a reference to Microsoft.WindowsCE.Forms
to your project, then add using Microsoft.WindowsCE.Forms;
to the top of your file.
To invert the screen by 180 degrees:
SystemSettings.ScreenOrientation = ScreenOrientation.Angle180;
To set back to normal:
SystemSettings.ScreenOrientation = ScreenOrientation.Angle0;
If you're running this in the emulator, your screen will still appear normally upright, but the skin gets flipped upside-down.
Update: one last shot at this, based on ctacke
's answer (this should work for signatures with any dimensions):
public void InvertSignature(ref byte[] original,
bool invertHorizontal, bool invertVertical)
{
short w = BitConverter.ToInt16(original, 0);
short h = BitConverter.ToInt16(original, 2);
int i = 4;
while (i < original.Length)
{
if (invertHorizontal)
{
if (w < 256)
{
if (original[i] != 0)
{
original[i] = (byte)w - original[i] - 1;
}
i++;
}
else
{
short val = BitConverter.ToInt16(original, i);
if (val != 0)
{
val = w - val - 1;
byte[] valbytes = BitConverter.GetBytes(val);
Buffer.BlockCopy(valbytes, 0, original, i, 2);
}
i += 2;
}
}
else
{
i += (w < 256) ? 1 : 2;
}
if (invertVertical)
{
if (h < 256)
{
if (original[i] != 0)
{
original[i] = (byte)h - original[i] - 1;
}
i++;
}
else
{
short val = BitConverter.ToInt16(original, i);
if (val != 0)
{
val = h - val - 1;
byte[] valbytes = BitConverter.GetBytes(val);
Buffer.BlockCopy(valbytes, 0, original, i, 2);
}
i += 2;
}
}
else
{
i += (h < 256) ? 1 : 2;
}
}
}