graphicstools/bitmapfonttools/src/PDRRECRD.CPP
author William Roberts <williamr@symbian.org>
Thu, 03 Jun 2010 17:39:46 +0100
branchNewGraphicsArchitecture
changeset 87 0709f76d91e5
parent 0 5d03bc08d59c
permissions -rw-r--r--
Add MMP files to build libOpenVG_sw.lib which uses LINKAS to redirect to libOpenVG.dll (and the same for libEGL_sw.lib and libOpenVGU_sw.lib). Only the libEGL_sw.lib redirection isn't activated - this can't happen until there is a merged libEGL.dll which supports the OpenWF synchronisation and also implements the graphical support functions. The overall aim is to eliminate the *_sw.dll implementations, at least as a compile-time way of choosing a software-only implementation.The correct way to choose is to put the right set of libraries into a ROM with suitable renaming, and in the emulator to use the "switching DLL" technique to pick the right set. As the Symbian Foundation doesn't have any alternative implementations, we don't need the switching DLLs and we can build directly to the correct name.

/*
* Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description: 
* Header PDRRECRD.CPP
*
*/


#include "PDRRECRD.H"

EXPORT_C PdrResource* PdrResource::New()
/** Creates a new instance of this class.

@return Reference to a new object. */
	{
	return new PdrResource();
	}

EXPORT_C void PdrResource::Delete()
/** Deletes the current object. */
	{
	delete this;
	}

void PdrResource::Externalize(ostream& out)
	{
	uint8 id = (uint8) iId;
	out.write((char*) &id, sizeof(id));
	iString.Externalize(out);
	}

EXPORT_C PdrResources* PdrResources::New()
/** Creates a new instance of this class.

@return Reference to a new object. */
	{
	return new PdrResources();
	}

EXPORT_C void PdrResources::Delete()
/** Deletes the current object. */
	{
	delete this;
	}

void PdrResources::Externalize(ostream& out)
	{
	iStreamId = out.tellp();
	iPdrResourceList.Externalize(out);
	}

EXPORT_C void PdrResources::AddResource(PdrResource* aResource)
/** Adds a printer resource to the object.

@param aResource Printer resource. */
	{
	iPdrResourceList.Add(aResource);
	}

PdrResources::~PdrResources()
/** Default destructor. */
	{
	iPdrResourceList.Destroy();
	}

EXPORT_C PdrTranslation* PdrTranslation::New()
/** Creates a new instance of this class.

@return Reference to a new object. */
	{
	return new PdrTranslation();
	}

EXPORT_C void PdrTranslation::Delete()
/** Deletes the current object. */
	{
	delete this;
	}

void PdrTranslation::Externalize(ostream& out)
	{
	out.write((char*) &iFrom, sizeof(iFrom));
	iTo.Externalize(out);
	}

EXPORT_C PdrTranslates* PdrTranslates::New()
/** Creates a new instance of this class.

@return Reference to a new object. */
	{
	return new PdrTranslates();
	}

EXPORT_C void PdrTranslates::Delete()
/** Deletes the current object. */
	{
	delete this;
	}

void PdrTranslates::Externalize(ostream& out)
	{
	iStreamId = out.tellp();
	iPdrTranslationList.Externalize(out);
	}

EXPORT_C void PdrTranslates::AddTranslation(PdrTranslation* aTranslation)
/** Adds a printer translation to the list.

@param aTranslation Reference to a translation. */
	{
	iPdrTranslationList.Add(aTranslation);
	}

PdrTranslates::~PdrTranslates()
/** This function is internal, and is not intended for use. */
	{
	iPdrTranslationList.Destroy();
	}

EXPORT_C Width* Width::New()
/** Creates a new instance of this object.

@return Reference to a new object. */
	{
	return new Width();
	}

EXPORT_C void Width::Delete()
/** Deletes the current object. */
	{
	delete this;
	}

void Width::Externalize(ostream& out)
	{
	out.write ((char*) &iWidthInPixels, sizeof(iWidthInPixels));
	}

WidthsCodeSection::WidthsCodeSection()
 :	iWidthList()
/** This function is internal only, and is not intended for use. */
	{
	}

EXPORT_C WidthsCodeSection* WidthsCodeSection::New()
/** Creates a new instance of this class.

@return Reference to a new object. */
	{
	return new WidthsCodeSection();
	}
	
EXPORT_C void WidthsCodeSection::Delete()
/** Deletes the current object. */
	{
	delete this;
	}

void WidthsCodeSection::Externalize(ostream& out)
	{
	out.write((char*) &iStart, sizeof(iStart));
	out.write((char*) &iEnd, sizeof(iEnd));
	iWidthList.Externalize(out);
	}
	
EXPORT_C void WidthsCodeSection::AddWidth(Width* aWidth)
/** Adds a new font width to the list.

@param aWidth Font width. */
	{
	iWidthList.Add(aWidth);
	}

EXPORT_C Width* WidthsCodeSection::WidthList(int i)
/** Returns a font width from the list at the position specified.

@param i Position of font width in list.
@return Reference to a font width. */
	{
	return iWidthList[i];
	}

EXPORT_C int WidthsCodeSection::NumWidths()
/** Returns the number of font widths in the list.

@return Number of widths. */
	{
	return iWidthList.Size();
	}

WidthsCodeSection::~WidthsCodeSection()
/** Default destructor. */
	{
	iWidthList.Destroy();
	}

EXPORT_C FontInfo* FontInfo::New()
/** Creates a new instance of this class.

@return Reference to a new instance of this class. */
	{
	return new FontInfo();
	}

EXPORT_C void FontInfo::Delete()
/** Deletes the current FontInfo object. */
	{
	delete this;
	}

void FontInfo::Externalize(ostream& out)
	{
	iStreamId = out.tellp();
	out.write((char*) &iAscentInPixels, sizeof(iAscentInPixels));
	out.write((char*) &iMaxCharWidthInPixels, sizeof(iMaxCharWidthInPixels));
	out.write((char*) &iMaxNormalCharWidthInPixels, sizeof(iMaxNormalCharWidthInPixels));
	iCodeSectionList.Externalize(out);
	}

EXPORT_C void FontInfo::AddCodeSection(WidthsCodeSection* aCodeSection)
/** Adds a section of information about the font to an internally-stored array.

@param aCodeSection Font information. */
	{
	iCodeSectionList.Add(aCodeSection);
	}	

EXPORT_C WidthsCodeSection* FontInfo::CodeSectionList(int i)
/** Returns a section of font information from a specified position in the internally-stored 
array.

@param i Postion of information in the array.
@return Reference to section of font information. */
	{
	return iCodeSectionList[i];
	}

EXPORT_C int FontInfo::NumCodeSections()
/** Returns the number of sections of font information in the internally-stored 
array.

@return Current number of font information sections. */
	{
	return iCodeSectionList.Size();
	}

FontInfo::~FontInfo()
/** This function is internal, and not intended for use. */
	{
	iCodeSectionList.Destroy();
	}

EXPORT_C PdrStyle* PdrStyle::New()
/** Creates a new instance of this class

@return Reference to a new object. */
	{
	return new PdrStyle();
	}

EXPORT_C void PdrStyle::Delete()
/** Deletes the current object. */
	{
	delete this;
	}

void PdrStyle::Externalize(ostream& out)
	{
	out.write((char*) &iIsAvailable, sizeof(iIsAvailable));
	streamoff streamid = 0;
	if (iIsAvailable)
		streamid = iFontInfo->iStreamId;
	::ExternalizeStreamOff(out, streamid);
	}

PdrStyle::PdrStyle()
 :	iIsAvailable(efalse)
/** Default constructor. */
	{
	}

EXPORT_C PdrFontHeight* PdrFontHeight::New()
/** Returns a new instance of this class.

@return Reference to new object. */
	{
	return new PdrFontHeight();
	}

EXPORT_C void PdrFontHeight::Delete()
/** Deletes the current object. */
	{
	delete this;
	}

void PdrFontHeight::Externalize(ostream& out)
	{
	iCommandString.Externalize(out);
	out.write((char*) &iHeightInTwips, sizeof(iHeightInTwips));
	out.write((char*) &iWidthScale, sizeof(iWidthScale));
	for (int style = Normal;style <= BoldItalic; style++)
		iStyle[style].Externalize(out);
	}

PdrFontHeight::PdrFontHeight():
	iWidthScale(1)
/** Default constructor. */
	{
	}

PdrScalableFontHeight::PdrScalableFontHeight()
/** Default constructor. */
	{
	}

void PdrScalableFontHeight::Externalize(ostream& out)
	{
	iCommandString.Externalize(out);
	out.write((char*) &iHeightMinInTwips, sizeof(iHeightMinInTwips));
	out.write((char*) &iHeightMaxInTwips, sizeof(iHeightMaxInTwips));
	out.write((char*) &iHeightDeltaInTwips, sizeof(iHeightDeltaInTwips));
	for (int style = Normal; style <= BoldItalic; style++)
		iStyle[style].Externalize(out);
	}

EXPORT_C TypefaceFonts* TypefaceFonts::New()
/** Creates a new instance of this class.

@return Reference to a new object. */
	{
	return new TypefaceFonts();
	}

EXPORT_C void TypefaceFonts::Delete()
/** Deletes the current object. */
	{
	delete this;
	}

void TypefaceFonts::Externalize(ostream& out)
	{
	iStreamId = out.tellp();
	iTypeface.Externalize(out);
	out.write((char*) &iIsScalable, sizeof(iIsScalable));
	if (iIsScalable)
		iScalableFontHeight.Externalize(out);
	else
		iFontHeightList.Externalize(out);
	::ExternalizeStreamOff(out, iTranslates->iStreamId);
	}

EXPORT_C void TypefaceFonts::AddFontHeight(PdrFontHeight* aFontHeight)
	{
	iFontHeightList.Add(aFontHeight);
	}

EXPORT_C int TypefaceFonts::NumFontHeights()
/** Returns the number of font height descriptions currently held in the list.

@return Number of descriptions. */
	{
	return iFontHeightList.Size();
	}

PdrFontHeight* TypefaceFonts::FontHeightList(int i)
/** Returns the font height description from the position specified in the list.

@param i Position of description.
@return Font height description. */
	{
	return iFontHeightList[i];
	}

TypefaceFonts::TypefaceFonts():
	iIsScalable(efalse)
/** This function is internal only, and is not intended for use. */
	{
	}

TypefaceFonts::~TypefaceFonts()
/** This function is internal only, and is not intended for use. */
	{
	iFontHeightList.Destroy();
	}

EXPORT_C TypefaceFontsEntry* TypefaceFontsEntry::New(Record* aTypefaceFonts)
	{
	return new TypefaceFontsEntry(aTypefaceFonts);
	}

EXPORT_C void TypefaceFontsEntry::Delete()
/** Deletes the current object. */
	{
	delete this;
	}
	
void TypefaceFontsEntry::Externalize(ostream& out)
	{
	::ExternalizeStreamOff(out, iTypefaceFonts->iStreamId);
	out.write((char*) &iNotInPortrait, sizeof(iNotInPortrait));
	out.write((char*) &iNotInLandscape, sizeof(iNotInLandscape));
	}

TypefaceFontsEntry::TypefaceFontsEntry(Record* aTypefaceFonts)
 :	iTypefaceFonts(aTypefaceFonts), iNotInPortrait(efalse), iNotInLandscape(efalse)
	{
	}

TypefaceFontsEntry::~TypefaceFontsEntry()
/** Default destructor. */
	{
	}

void Margins::Externalize(ostream& out)
	{
	out.write((char*) &iLeft, sizeof(iLeft));
	out.write((char*) &iRight, sizeof(iRight));
	out.write((char*) &iTop, sizeof(iTop));
	out.write((char*) &iBottom, sizeof(iBottom));
	}

/*
PdrExtraInfo::~PdrExtraInfo()
	{
	iInfo.Destroy();
	}

void PdrExtraInfo::Externalize(ostream& out)
	{
	iInfo.Externalize(out);
	}
*/

void PdrModelInfo::Externalize(ostream& out)
	{
	iStreamId=out.tellp();
	out.write((char*) &KPdrtranVersion, sizeof(KPdrtranVersion));
	out.write((char*) &iFlags, sizeof(iFlags));
	out.write((char*) &iKPixelWidthInTwips, sizeof(iKPixelWidthInTwips));
	out.write((char*) &iKPixelHeightInTwips, sizeof(iKPixelHeightInTwips));
	iPortraitOffsetInPixels.Externalize(out);
	iLandscapeOffsetInPixels.Externalize(out);
	iMinMarginsInPixels.Externalize(out);
	out.write((char*) &iDisplayMode, sizeof(iDisplayMode));
	iTypefaceFontsEntryList.Externalize(out);
	::ExternalizeStreamOff(out, iResources->iStreamId);
	streamoff streamid = 0;
	if (iSpareRecord)
		streamid = iSpareRecord->iStreamId;
	::ExternalizeStreamOff(out, streamid);
	}
 
EXPORT_C void PdrModelInfo::AddTypefaceFontsEntry(TypefaceFontsEntry* aTypefaceFontsEntry)
/** Adds an entry containing information about typeface fonts to an internally-stored 
array.

@param aTypefaceFontsEntry Typeface font information. */
	{
	iTypefaceFontsEntryList.Add(aTypefaceFontsEntry);
	}

int PdrModelInfo::NumTypefaceFontsEntries()
/** Returns the number of entries containing information about typeface fonts in 
the internally-stored array.

@return Number of entries. */
	{
	return iTypefaceFontsEntryList.Size();
	}

TypefaceFontsEntry* PdrModelInfo::TypefaceFontsEntryList(int i)
/** Returns the typeface font entry stored the internal array from the position 
specified.

@param i Position in array.
@return Typeface font entry. */
	{
	return iTypefaceFontsEntryList[i];
	}

PdrModelInfo::PdrModelInfo()
 :	iStreamId(0),
	iFlags(0),
	iKPixelWidthInTwips(0),
	iKPixelHeightInTwips(0),
	iPortraitOffsetInPixels(),
	iLandscapeOffsetInPixels(),
	iMinMarginsInPixels(),
	iDisplayMode(0),
	iTypefaceFontsEntryList(),
	iResources(NULL),
	iSpareRecord(NULL)	// !! Not used yet
/** Default constructor. */
	{
	}

PdrModelInfo::~PdrModelInfo()
/** Default destructor. */
	{
	iTypefaceFontsEntryList.Destroy();
	}

PrinterModelEntry::PrinterModelEntry()
 :	iName(), iRequiresPrinterPort(efalse), iUid(KNullUid)
/** Default constructor. */
	{
	}

void PrinterModelEntry::Externalize(ostream& out)
	{
	iName.Externalize(out);
	out.write((char*) &iRequiresPrinterPort, sizeof(iRequiresPrinterPort));
	out.write((char*) &iUid, sizeof(iUid));
	}

EXPORT_C PrinterModelHeader* PrinterModelHeader::New()
/** Creates a new instance of this class.

@return Reference to a new object. */
	{
	return new PrinterModelHeader();
	}

EXPORT_C void PrinterModelHeader::Delete()
/** Deletes the current object. */
	{
	delete this;
	}

void PrinterModelHeader::Externalize(ostream& out)
	{
	iEntry.Externalize(out);
	::ExternalizeStreamOff(out, iInfo.iStreamId);
	}

void PrinterModelHeader::ExternalizeData(ostream& out)
	{
	iInfo.Externalize(out);
	}

boolean PrinterModelHeader::IsPdrModel()
/** Determines whether printer information is available for this printer model.

@return ETrue: printer description is available. */
	{
	return iInfo.NumTypefaceFontsEntries() || iInfo.iResources;
	}

EXPORT_C PdrStoreFile* PdrStoreFile::New()
/** Creates a new instance of this class.

@return Reference to a new object. */
	{
	return new PdrStoreFile();
	}

EXPORT_C void PdrStoreFile::Delete()
/** Deletes the current object. */
	{
	delete this;
	}

EXPORT_C void PdrStoreFile::AddModel(PrinterModelHeader* aModel)
/** Adds a printer model.

@param aModel Printer model. */
	{
	iModelList.Add(aModel);
	if (aModel->IsPdrModel())
		{
		for (int i = 0; i < aModel->iInfo.NumTypefaceFontsEntries(); i++)
			AddTypefaceFonts((TypefaceFonts*) aModel->iInfo.TypefaceFontsEntryList(i)->iTypefaceFonts);
		iResourcesList.Add(aModel->iInfo.iResources);
//		if (aModel->iInfo.iSpareRecord)
//			iExtraInfoList.Add(aModel->iInfo.iSpareRecord);
		}
	}

void PdrStoreFile::Externalize(ostream& out)
	{
	ExternalizeHeader(out);
	ExternalizeComponents(out);
	}

void PdrStoreFile::ExternalizeHeader(ostream& out)
	{
	out.write((char*) &KStoreWriteOnceLayoutUid, sizeof(KStoreWriteOnceLayoutUid));
	out.write((char*) &KPdrStoreFileUid, sizeof(KPdrStoreFileUid));
	out.write((char*) &KNullUid, sizeof(KNullUid));
	out.write((char*) &KPdrStoreFileChecksum, sizeof(KPdrStoreFileChecksum));
	::ExternalizeStreamOff(out, iStreamId);
	iStreamId = out.tellp();
	iPDLName.Externalize(out);
	out.write((char*) &iPDLUid, sizeof(iPDLUid));
	iModelList.Externalize(out);
	}

void PdrStoreFile::AddTypefaceFonts(TypefaceFonts* aTypefaceFonts)
	{
	iTypefaceFontsList.Add(aTypefaceFonts);
	iTranslatesList.Add(aTypefaceFonts->iTranslates);
	if (aTypefaceFonts->iIsScalable)
		{
		for (int style = Normal; style <= BoldItalic; style++)
			{
			if (aTypefaceFonts->iScalableFontHeight.iStyle[style].iIsAvailable)
				iFontInfoList.Add(aTypefaceFonts->iScalableFontHeight.iStyle[style].iFontInfo);
			}
		}
	else
		{
		for (int j = 0; j < aTypefaceFonts->NumFontHeights(); j++)
			{
			PdrFontHeight* fontheight = aTypefaceFonts->FontHeightList(j);
			for (int style = Normal; style <= BoldItalic; style++)
				{
				if (fontheight->iStyle[style].iIsAvailable)
					iFontInfoList.Add(fontheight->iStyle[style].iFontInfo);
				}
			}
		}
	}

void PdrStoreFile::ExternalizeComponents(ostream& out)
	{
	for (int i = 0; i < iModelList.Size(); i++)
		{
		PrinterModelHeader* model = (PrinterModelHeader*) iModelList[i];
		if (model->IsPdrModel())
			model->ExternalizeData(out);
		}
	iTypefaceFontsList.Externalize(out);
	iFontInfoList.Externalize(out);
	iResourcesList.Externalize(out);
	iTranslatesList.Externalize(out);
//	iExtraInfoList.Externalize(out);
	}

PdrStoreFile::PdrStoreFile()
 :	Record(),
	iPDLName(),
	iPDLUid(KNullUid),
	iModelList(),
	iTypefaceFontsList(),
	iFontInfoList(),
	iResourcesList(),
	iTranslatesList()
/** This function is internal only, and is not intended for use. */
	{
	}

EXPORT_C boolean PdrModelStore::Store(const String& aFilename)
/** Externalizes printer information from the store to the specfied external file.

@param aFilename Filename.
@return ETrue: store successful. */
	{
	boolean state = efalse;
	ofstream fout;
	String string = aFilename;
	fout.open(string.Text(), ios::binary);
	if (!fout.fail())
		{
		iPdrStoreFile->Externalize(fout);
		fout.close();
		fout.open(string.Text(), ios::binary | ios::trunc);
		iPdrStoreFile->Externalize(fout);
		fout.close();
		state = etrue;
		}
	return state;
	}

EXPORT_C void PdrModelStore::AddPdrStoreFile(PdrStoreFile* aPdrStoreFile)
	{
	iPdrStoreFile = aPdrStoreFile;
	}

EXPORT_C void PdrModelStore::AddModel(PrinterModelHeader *aModel)
/** Adds a printer model to the store.

@param aModel Printer model. */
	{
	iModelList.Add(aModel);
	}

EXPORT_C Record *PdrModelStore::FindModel(String& aLabel)
	{
	return iModelList.LabelToRecord(aLabel);
	}

EXPORT_C void PdrModelStore::AddTypefaceFonts(TypefaceFonts *aTypefaceFonts)
/** Adds typeface information to the store.

@param aTypefaceFonts Typeface fonts. */
	{
	iTypefaceFontsList.Add(aTypefaceFonts);
	}

EXPORT_C Record *PdrModelStore::FindTypefaceFonts(String& aLabel)
	{
	return iTypefaceFontsList.LabelToRecord(aLabel);
	}

EXPORT_C void PdrModelStore::AddFontInfo(FontInfo *aFontInfo)
/** Adds font information to the store.

@param aFontInfo Font information. */
	{
	iFontInfoList.Add(aFontInfo);
	}

EXPORT_C Record *PdrModelStore::FindFontInfo(String& aLabel)
	{
	return iFontInfoList.LabelToRecord(aLabel);
	}

EXPORT_C void PdrModelStore::AddResources(PdrResources *aResources)
	{
	iResourcesList.Add(aResources);
	}

EXPORT_C Record *PdrModelStore::FindResources(String& aLabel)
	{
	return iResourcesList.LabelToRecord(aLabel);
	}

EXPORT_C void PdrModelStore::AddTranslates(PdrTranslates *aTranslates)
/** Adds printer translations to the store.

@param aTranslates Translation list. */
	{
	iTranslatesList.Add(aTranslates);
	}

EXPORT_C Record *PdrModelStore::FindTranslates(String& aLabel)
	{
	return iTranslatesList.LabelToRecord(aLabel); 
	}

	/*
void PdrModelStore::AddExtraInfo(PdrExtraInfo *aInfo)
	{
	iExtraInfoList.Add(aInfo);
	}

Record* PdrModelStore::FindExtraInfo(String& aLabel)
	{
	return iExtraInfoList.LabelToRecord(aLabel);
	}
*/

PdrModelStore::PdrModelStore()
 :	iPdrStoreFile(NULL),
	iModelList(),
	iTypefaceFontsList(),
	iFontInfoList(),
	iResourcesList()//,
//	iExtraInfoList()
/** Default constructor. */
	{
	}

PdrModelStore::~PdrModelStore()
/** Default destructor. */
	{
	delete iPdrStoreFile;
	iModelList.Destroy();
	iTypefaceFontsList.Destroy();
	iFontInfoList.Destroy();
	iResourcesList.Destroy();
	iTranslatesList.Destroy();
//	iExtraInfoList.Destroy();
	}