/*
 * OSD Picture in Picture plugin for the Video Disk Recorder
 *
 * See the README file for copyright information and how to reach the author.
 */

#include "config.h"

#if MAXNUMCOLORS < 256
#	warning WARNING: YOU WILL NOT BE ABLE TO USE 256 COLOR PIP
#endif

#ifndef VDR_OSDPIP_PATCHED
# warning WARNING: YOU WILL NOT BE ABLE TO USE VARIABLE COLOR PIP
#endif

#if MAXNUMCOLORS < 256
const int kColorDepths = 1;
#else
# ifndef VDR_OSDPIP_PATCHED
const int kColorDepths = 3;
# else
const int kColorDepths = 4;
# endif
#endif

const int kSizes = 6;
const int kFrameModes = 3;
const int kInfoPositions = 4;

const char *ColorDepthItems[] = {
	"Greyscale (16)",
	"Greyscale (128)",
	"Color (256, fixed)",
	"Color (128, variable)"
};

const char *SizeItems[] = {
	"120x96",
	"160x128",
	"200x160",
	"240x192",
	"280x224",
	"320x256"
};

const char *FrameModeItems[] = {
	"I-Frames",
	"I-, P-Frames",
	"I-, P-, B-Frames"
};

const char *InfoPositionItems[] = {
	"top left",
	"top right",
	"bottom left",
	"bottom right"
};

cOsdPipSetup OsdPipSetup;

cOsdPipSetup::cOsdPipSetup(void) {
	XPosition  = 50;
	YPosition  = 50;
	CropLeft   = 5;
	CropRight  = 5;
	CropTop    = 5;
	CropBottom = 5;
	ColorDepth = kDepthGrey16;
	Size = 2;
	FrameMode = kFrameModeI;
	FrameDrop = 0;
	SwapFfmpeg = 1;
	ShowInfo = 1;
	InfoWidth = 400;
	InfoPosition = kInfoBottomLeft;
}

bool cOsdPipSetup::SetupParse(const char *Name, const char *Value) {
	if      (strcmp(Name, "XPosition")    == 0) XPosition    = atoi(Value);
	else if (strcmp(Name, "YPosition")    == 0) YPosition    = atoi(Value);
	else if (strcmp(Name, "CropLeft")     == 0) CropLeft     = atoi(Value);
	else if (strcmp(Name, "CropRight")    == 0) CropRight    = atoi(Value);
	else if (strcmp(Name, "CropTop")      == 0) CropTop      = atoi(Value);
	else if (strcmp(Name, "CropBottom")   == 0) CropBottom   = atoi(Value);
	else if (strcmp(Name, "ColorDepth")   == 0) ColorDepth   = atoi(Value);
	else if (strcmp(Name, "Size")         == 0) Size         = atoi(Value);
	else if (strcmp(Name, "FrameMode")    == 0) FrameMode    = atoi(Value);
	else if (strcmp(Name, "FrameDrop")    == 0) FrameDrop    = atoi(Value);
	else if (strcmp(Name, "SwapFfmpeg")   == 0) SwapFfmpeg   = atoi(Value);
	else if (strcmp(Name, "ShowInfo")     == 0) ShowInfo     = atoi(Value);
	else if (strcmp(Name, "InfoWidth")    == 0) InfoWidth    = atoi(Value);
	else if (strcmp(Name, "InfoPosition") == 0) InfoPosition = atoi(Value);
	else return false;
	return true;
}

cOsdPipSetupPage::cOsdPipSetupPage(void) {
	m_NewOsdPipSetup = OsdPipSetup;

	Add(new cMenuEditIntItem(tr("Crop left"), &m_NewOsdPipSetup.CropLeft, 0, 80));
	Add(new cMenuEditIntItem(tr("Crop right"), &m_NewOsdPipSetup.CropRight, 0, 
			80));
	Add(new cMenuEditIntItem(tr("Crop at top"), &m_NewOsdPipSetup.CropTop, 0, 
			80));
	Add(new cMenuEditIntItem(tr("Crop at bottom"), &m_NewOsdPipSetup.CropBottom, 
			0, 80));
	Add(new cMenuEditStraItem(tr("Color depth"),
			&m_NewOsdPipSetup.ColorDepth, kColorDepths, ColorDepthItems));
	Add(new cMenuEditStraItem(tr("Size"),
			&m_NewOsdPipSetup.Size, kSizes, SizeItems));
	Add(new cMenuEditStraItem(tr("Frames to display"),
			&m_NewOsdPipSetup.FrameMode, kFrameModes, FrameModeItems));
	Add(new cMenuEditIntItem(tr("Drop frames"), &m_NewOsdPipSetup.FrameDrop, 0, 2));
	Add(new cMenuEditBoolItem(tr("Swap FFMPEG output"), &m_NewOsdPipSetup.SwapFfmpeg));
	Add(new cMenuEditBoolItem(tr("Show info window"), &m_NewOsdPipSetup.ShowInfo));
	Add(new cMenuEditIntItem(tr("Info window width"), &m_NewOsdPipSetup.InfoWidth, 200, 600));
	Add(new cMenuEditStraItem(tr("Info window position"),
			&m_NewOsdPipSetup.InfoPosition, kInfoPositions, InfoPositionItems));
}

cOsdPipSetupPage::~cOsdPipSetupPage() {
}

void cOsdPipSetupPage::Store(void) {
	OsdPipSetup = m_NewOsdPipSetup;

	SetupStore("XPosition",    OsdPipSetup.XPosition);
	SetupStore("YPosition",    OsdPipSetup.YPosition);
	SetupStore("CropLeft",     OsdPipSetup.CropLeft);
	SetupStore("CropRight",    OsdPipSetup.CropRight);
	SetupStore("CropTop",      OsdPipSetup.CropTop);
	SetupStore("CropBottom",   OsdPipSetup.CropBottom);
	SetupStore("ColorDepth",   OsdPipSetup.ColorDepth);
	SetupStore("Size",         OsdPipSetup.Size);
	SetupStore("FrameMode",    OsdPipSetup.FrameMode);
	SetupStore("FrameDrop",    OsdPipSetup.FrameDrop);
	SetupStore("SwapFfmpeg",   OsdPipSetup.SwapFfmpeg);
	SetupStore("ShowInfo",     OsdPipSetup.ShowInfo);
	SetupStore("InfoWidth",    OsdPipSetup.InfoWidth);
	SetupStore("InfoPosition", OsdPipSetup.InfoPosition);
}