// BKOscScrGDI.cpp: определяет экспортированные функции для приложения DLL.
//

#include "pch.h"
#include "BKOscScrGDI.h"

#include "atltypes.h"

BKEXTERN_C
{

	BKOSCDLL_API BKOSCSCRHANDLE APIENTRY GetBKOscScr()
	{
		return new CBKOscScrGDI;
	}

	CBKOscScrGDI::CBKOscScrGDI()
		: m_pDC(nullptr)
		, m_hwndScreen(nullptr)
	{
	}
	CBKOscScrGDI::~CBKOscScrGDI()
	= default;

	void CBKOscScrGDI::BKOSC_OnSize(int cx, int cy)
	{
	}

	HRESULT CBKOscScrGDI::BKOSC_OnSetBuffer(int nLen)
	{
		return S_OK;
	}


	HRESULT CBKOscScrGDI::BKOSC_Screen_Init(CWnd * pWndScreen)
	{
		HRESULT hr = E_FAIL;

		if (pWndScreen)
		{
			m_pDC = pWndScreen->GetDC();
			m_hwndScreen = pWndScreen->GetSafeHwnd();
			hr = S_OK;
		}

		return hr;
	}

	void CBKOscScrGDI::BKOSC_Screen_Done()
	{
	}


	void CBKOscScrGDI::BKOSC_OnDisplay(SAMPLE_INT * inBuf, int inLen)
	{
		static CPen penWhite(PS_SOLID, 0, RGB(255, 255, 255));
		static CPen penGreen(PS_SOLID, 0, RGB(0, 255, 0));
		static CPen penLightSlateGray(PS_SOLID, 0, RGB(0x77, 0x88, 0x99));
		CRect rectClient;
		GetClientRect(m_hwndScreen, &rectClient);
		// очищаем экран
		m_pDC->FillSolidRect(&rectClient, RGB(0, 0, 0));
		CPoint rtSize(rectClient.Width(), rectClient.Height());
		// rtSize.x - ширина окна
		// rtSize.y - высота окна
		float scalex = float(rtSize.x) / float(inLen);
		LONG half = rtSize.y / 2;
		// рисуем разделительную линию между каналами
		m_pDC->SelectObject(&penLightSlateGray);
		m_pDC->MoveTo(0, half);  // ставим точку
		m_pDC->LineTo(rtSize.x, half);
		LONG h4 = rtSize.y / 4;
		LONG h34 = rtSize.y * 3 / 4;
		CPoint pntbgnL(0,        h4);
		CPoint pntendL(rtSize.x, h4);
		CPoint pntbgnR(0,        h34);
		CPoint pntendR(rtSize.x, h34);
		// рисуем линии центров каналов.
		m_pDC->SelectObject(&penWhite);
		m_pDC->MoveTo(pntbgnL);
		m_pDC->LineTo(pntendL);
		m_pDC->MoveTo(pntbgnR);
		m_pDC->LineTo(pntendR);
		m_pDC->SelectObject(&penGreen);

		for (int i = 0; i < inLen; ++i)
		{
			// рисуем левый канал -1.0 .. 1.0 => height/2 .. 0
			pntendR.x = pntendL.x = LONG(float(i) * scalex);
			pntendL.y = h4 - LONG((*inBuf++) * h4);
			m_pDC->MoveTo(pntbgnL);
			m_pDC->LineTo(pntendL);
			pntbgnL = pntendL;
			// рисуем правый канал -1.0 .. 1.0 => height .. height/2
			pntendR.y = h34 - LONG((*inBuf++) * h4);
			m_pDC->MoveTo(pntbgnR);
			m_pDC->LineTo(pntendR);
			pntbgnR = pntendR;
		}
	}
};
