MemCpy revisited (in Unsafe code)

  • Thread starter Thread starter Johannes Bialek
  • Start date Start date
J

Johannes Bialek

Hi,
Buffer.BlockCopy() and Array.Copy() seem do be fine for Arrays, but what to
do about copying memory in unsafe code?
The goal is simple, I just want to scroll the content of an Image vertically
for some lines.. (using the CompactFramework, but seems to be of general
interrest). So I moved byte-per-byte which is awfully slow :(

Code:
System.Drawing.Imaging.BitmapData bd = buffer.LockBits(all,
System.Drawing.Imaging.ImageLockMode.ReadWrite,
System.Drawing.Imaging.PixelFormat.Format16bppRgb555);
int cnt = ((buffer.Height - Math.Abs(lines)) * bd.Stride);
byte* src = (byte*)bd.Scan0.ToInt32() + lines * bd.Stride;
byte* dst = (byte*)bd.Scan0.ToInt32();

for (int i = 0; i < cnt; i++)
{
*dst = *src;
dst++;
src++;
}

I really would like to see this for-loop removed by some "native" code...
any suggestions?!

Thanks,
Johannes
 
Johannes,
I really would like to see this for-loop removed by some "native" code...
any suggestions?!

There's an IL instruction called "cpblk" that does a memcopy, but
unfortunately there's no way to generate that from C#. But assuming
it's supported on CF (which I know little about) you could write a
small helper library in IL assembler that uses it.

Other options on the desktop is to call RtlMoveMemory in kernel32.dll
or memcpy exported from some C++ CRT library through P/Invoke. I don't
know if either of those are available from CF.


Mattias
 
Back
Top