CopyOverlapped function defined in GameRes.Utitlity now.

CopyOverlapped copies ranges within array the same way standard C
function memcpy does (that is, ignoring potential region overlapping).
This commit is contained in:
morkt 2014-08-25 15:04:26 +04:00
parent 01464389d2
commit b0f621e8ab
3 changed files with 18 additions and 32 deletions

View File

@ -151,7 +151,7 @@ namespace GameRes.Formats.DRS
src_offset = out_pos - 3 * input.ReadByte (); src_offset = out_pos - 3 * input.ReadByte ();
if (count < 0 || count > pixel_count || src_offset < 0 || src_offset == out_pos) if (count < 0 || count > pixel_count || src_offset < 0 || src_offset == out_pos)
return null; return null;
CopyOverlapped (output, src_offset, out_pos, count); Binary.CopyOverlapped (output, src_offset, out_pos, count);
out_pos += count; out_pos += count;
pixel_count -= count; pixel_count -= count;
break; break;
@ -163,7 +163,7 @@ namespace GameRes.Formats.DRS
src_offset = out_pos - 3 * (off_hi << 8 | off_lo); src_offset = out_pos - 3 * (off_hi << 8 | off_lo);
if (count < 0 || count > pixel_count || src_offset < 0 || src_offset == out_pos) if (count < 0 || count > pixel_count || src_offset < 0 || src_offset == out_pos)
return null; return null;
CopyOverlapped (output, src_offset, out_pos, count); Binary.CopyOverlapped (output, src_offset, out_pos, count);
out_pos += count; out_pos += count;
pixel_count -= count; pixel_count -= count;
break; break;
@ -205,20 +205,6 @@ namespace GameRes.Formats.DRS
return output; return output;
} }
static internal void CopyOverlapped (byte[] data, int src, int dst, int count)
{
int preceding = dst-src;
while (count > 0)
{
if (preceding > count)
preceding = count;
Array.Copy (data, src, data, dst, preceding);
src = dst;
dst += preceding;
count -= preceding;
}
}
internal class Writer : IDisposable internal class Writer : IDisposable
{ {
BinaryWriter m_out; BinaryWriter m_out;

View File

@ -399,26 +399,12 @@ namespace GameRes.Formats.Majiro
shift *= 3; shift *= 3;
if (shift >= 0 || data_pos+shift < 0) if (shift >= 0 || data_pos+shift < 0)
throw new InvalidFormatException(); throw new InvalidFormatException();
CopyOverlapped (m_data, data_pos+shift, data_pos, count); Binary.CopyOverlapped (m_data, data_pos+shift, data_pos, count);
data_pos += count; data_pos += count;
} }
} }
} }
static internal void CopyOverlapped (byte[] data, int src, int dst, int count)
{
int preceding = dst-src;
while (count > 0)
{
if (preceding > count)
preceding = count;
Array.Copy (data, src, data, dst, preceding);
src = dst;
dst += preceding;
count -= preceding;
}
}
#region IDisposable Members #region IDisposable Members
bool disposed = false; bool disposed = false;
@ -575,7 +561,7 @@ namespace GameRes.Formats.Majiro
shift -= shift_row; shift -= shift_row;
if (shift >= 0 || data_pos+shift < 0) if (shift >= 0 || data_pos+shift < 0)
throw new InvalidFormatException(); throw new InvalidFormatException();
RctFormat.Reader.CopyOverlapped (m_data, data_pos+shift, data_pos, count); Binary.CopyOverlapped (m_data, data_pos+shift, data_pos, count);
data_pos += count; data_pos += count;
} }
} }

View File

@ -69,6 +69,20 @@ namespace GameRes.Utility
return false; return false;
return true; return true;
} }
public static void CopyOverlapped (byte[] data, int src, int dst, int count)
{
int preceding = dst-src;
while (count > 0)
{
if (preceding > count)
preceding = count;
System.Array.Copy (data, src, data, dst, preceding);
src = dst;
dst += preceding;
count -= preceding;
}
}
} }
public static class LittleEndian public static class LittleEndian