// fp_PageSize.cpp
#include "fp_PageSize.h"
#include "ut_units.h"
#include "ut_assert.h"


// This class stores the pagesize in mm. The resoning behind
// that is that mm is at least a derived unit from an ISO standard.
// If anyone think it's more apropriate to express it in meters,
// you're free to change the implementation.

struct private_pagesize_sizes
{
	double w;
	double h;
	fp_PageSize::Unit u;
};

const private_pagesize_sizes
	pagesizes[fp_PageSize::_last_predefined_pagesize_dont_use_] =
{
	 841.0, 1189.0, fp_PageSize::mm,		// A0
	 594.0,  841.0, fp_PageSize::mm,		// A1
	 420.0,  594.0, fp_PageSize::mm,		// A2
	 297.0,  420.0, fp_PageSize::mm,		// A3
	 210.0,  297.0, fp_PageSize::mm,		// A4
	 148.0,  210.0, fp_PageSize::mm,		// A5
	 105.0,  148.0, fp_PageSize::mm,		// A6
	1000.0, 1414.0, fp_PageSize::mm,		// B0
	 707.0, 1000.0, fp_PageSize::mm,		// B1
	 500.0,  707.0, fp_PageSize::mm,		// B2
	 353.0,  500.0, fp_PageSize::mm,		// B3
	 250.0,  353.0, fp_PageSize::mm,		// B4
	 176.0,  250.0, fp_PageSize::mm,		// B5
	 125.0,  176.0, fp_PageSize::mm,		// B6
	   8.5,   14.0, fp_PageSize::inch,		// Legal
	   8.5,   13.0, fp_PageSize::inch,		// Folio
	   8.5,   11.0, fp_PageSize::inch,		// Letter
};

const double ScaleFactors[fp_PageSize::_last_predefined_unit_dont_use_] =
{
	1.0,							// mm
	10.0,							// cm
	25.4,							// inch
	25.4 / UT_PAPER_UNITS_PER_INCH,	// PaperUnit
	25.4 / UT_LAYOUT_UNITS			// LayoutUnit
};

fp_PageSize::fp_PageSize(Predefined preDef)
{
	Set(preDef);
}

fp_PageSize::fp_PageSize(double w, double h, Unit u)
{
	UT_ASSERT(u >= 0 && u < _last_predefined_unit_dont_use_);
	Set(w, h, u);
}

void fp_PageSize::Set(double w, double h, Unit u)
{
	UT_ASSERT(u >= 0 && u < _last_predefined_unit_dont_use_);
	m_iWidth  = w * ScaleFactors[u];
	m_iHeight = h * ScaleFactors[u];
}

void fp_PageSize::Set(Predefined preDef)
{
	const private_pagesize_sizes& size = pagesizes[preDef];
	Set(size.w, size.h, size.u);
}

double fp_PageSize::Width(Unit u) const
{
	UT_ASSERT(u >= 0 && u < _last_predefined_unit_dont_use_);
	return m_iWidth / ScaleFactors[u];
}

double fp_PageSize::Height(Unit u) const
{
	UT_ASSERT(u >= 0 && u < _last_predefined_unit_dont_use_);
	return m_iHeight / ScaleFactors[u];
}