mirror of
https://github.com/crskycode/GARbro.git
synced 2024-11-27 15:44:00 +08:00
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:
parent
01464389d2
commit
b0f621e8ab
@ -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;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user