BizHawk/BizHawk.Emulation.Cores/SideBySideVideo.cs

59 lines
1.4 KiB
C#

using BizHawk.Emulation.Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BizHawk.Emulation.Cores
{
public class SideBySideVideo : IVideoProvider
{
public SideBySideVideo(IVideoProvider l, IVideoProvider r)
{
_l = l;
_r = r;
_buff = new int[BufferWidth * BufferHeight];
}
private static unsafe void Blit(int* src, int srcp, int* dst, int dstp, int w, int h)
{
int* srcend = src + h * srcp;
while (src < srcend)
{
for (int j = 0; j < w; j++)
dst[j] = src[j];
src += srcp;
dst += dstp;
}
}
public unsafe void Fetch()
{
int h = BufferHeight;
int w = BufferWidth;
fixed(int* _pl = _l.GetVideoBuffer(), _pr = _r.GetVideoBuffer(), _pd = _buff)
{
Blit(_pl, w / 2, _pd, w, w / 2, h);
Blit(_pr, w / 2, _pd + w / 2, w, w / 2, h);
}
}
private readonly IVideoProvider _l;
private readonly IVideoProvider _r;
private int[] _buff;
public int BackgroundColor => _l.BackgroundColor;
public int BufferHeight => _l.BufferHeight;
public int BufferWidth => _l.BufferWidth * 2;
public int VirtualHeight => _l.VirtualHeight;
public int VirtualWidth => _l.VirtualWidth * 2;
public int VsyncDenominator => _l.VsyncDenominator;
public int VsyncNumerator => _l.VsyncNumerator;
public int[] GetVideoBuffer()
{
return _buff;
}
}
}