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 FNTRECRD.CPP
*
*/
#include "FNTRECRD.H"
const int KNumberOfPopularIndices = 128;
const int KNumberOfBitsInByte = 8;
const int KNumberOfBitsInTwoBytes = 16;
BitmapOffset::BitmapOffset(uint16 aBitmapOffset)
: iBitmapOffset(aBitmapOffset)
{}
void BitmapOffset::Externalize(ostream& out)
{
out.write((char*) &iBitmapOffset,sizeof(iBitmapOffset));
}
CharacterMetrics::CharacterMetrics()
: iAscentInPixels(0),
iHeightInPixels(0),
iLeftAdjustInPixels(0),
iMoveInPixels(0),
iRightAdjustInPixels(0)
{
}
void CharacterMetrics::Externalize(ostream& out)
{
out.write((char*) &iAscentInPixels, sizeof(iAscentInPixels));
out.write((char*) &iHeightInPixels, sizeof(iHeightInPixels));
out.write((char*) &iLeftAdjustInPixels, sizeof(iLeftAdjustInPixels));
out.write((char*) &iMoveInPixels, sizeof(iMoveInPixels));
out.write((char*) &iRightAdjustInPixels, sizeof(iRightAdjustInPixels));
}
MetricDistributionMember::~MetricDistributionMember()
{
delete iMetric;
}
MetricDistributionMember::MetricDistributionMember()
: iFrequency(0), iMetric(0)
{}
CharacterMetrics* MetricDistributionMember::Metric() const
{
return iMetric;
}
int MetricDistributionMember::Frequency() const
{
return iFrequency;
}
void MetricDistributionMember::SetFrequency(int aFrequency)
{
iFrequency = aFrequency;
}
void MetricDistributionMember::IncrementFrequency(int aIncrementBy)
{
iFrequency += aIncrementBy;
}
void MetricDistributionMember::SetMetric(CharacterMetrics* aMetric)
{
iMetric = aMetric;
}
void MetricDistributionMember::Externalize(ostream& out)
{
iMetric->Externalize(out);
}
MetricDistribution::~MetricDistribution()
{
iCharacterMetricsList.Destroy();
}
MetricDistribution* MetricDistribution::New()
{
return new MetricDistribution;
}
MetricDistribution::MetricDistribution()
{}
void MetricDistribution::SortMetricsByFrequency()
{ // Only need sort the most popular 128, since after this 2 bytes will always be used
int maxIndex = iCharacterMetricsList.Size();
if (maxIndex > KNumberOfPopularIndices)
{
maxIndex = KNumberOfPopularIndices;
}
for(int indexToSet = 0; indexToSet < maxIndex; indexToSet++)
{
const CharacterMetrics& mostPopularRemaining = MostPopular(indexToSet);
SetIndex(mostPopularRemaining, indexToSet);
}
}
void MetricDistribution::SetIndex(const CharacterMetrics& aMetrics, int aIndexToSet)
{
int currentPos = Index(aMetrics);
if (currentPos != aIndexToSet)
{
MetricDistributionMember* match = iCharacterMetricsList[currentPos];
MetricDistributionMember* swapPos = iCharacterMetricsList[aIndexToSet];
CharacterMetrics* tempMet = match->Metric();
const int tempFreq = match->Frequency();
match->SetMetric(swapPos->Metric());
match->SetFrequency(swapPos->Frequency());
swapPos->SetMetric(tempMet);
swapPos->SetFrequency(tempFreq);
}
}
void MetricDistribution::AddOrIncrementMetric(const CharacterMetrics& aMetrics, int aFrequency)
{
boolean match = false;
const CharacterMetrics* trial = NULL;
MetricDistributionMember* link = NULL;
int index;
int maxIndex = iCharacterMetricsList.Size();
for(index = 0; index < maxIndex && !match; index++)
{
link = iCharacterMetricsList[index];
if (link)
trial = link->Metric();
if (trial && (trial->iAscentInPixels == aMetrics.iAscentInPixels)
&& (trial->iHeightInPixels == aMetrics.iHeightInPixels)
&& (trial->iLeftAdjustInPixels == aMetrics.iLeftAdjustInPixels)
&& (trial->iMoveInPixels == aMetrics.iMoveInPixels)
&& (trial->iRightAdjustInPixels == aMetrics.iRightAdjustInPixels))
{
match = true;
}
}
if (match)
{
link->IncrementFrequency(aFrequency);
}
else
{
MetricDistributionMember* newLink = new MetricDistributionMember;
newLink->IncrementFrequency(aFrequency);
CharacterMetrics* newMetric = new CharacterMetrics(aMetrics);
newLink->SetMetric(newMetric);
iCharacterMetricsList.Add(newLink);
}
}
const CharacterMetrics& MetricDistribution::MostPopular(int aStartIndex)
{
// finds the most popular metric above index aStartIndex. Allows for a fairly quick sort of the metircs to be done.
MetricDistributionMember* link = NULL;
const CharacterMetrics* mostPopular = NULL;
int frequencyOfMostPopular = 0;
int frequency = 0;
int count;
int total = 0; // for debugging
const int size = iCharacterMetricsList.Size();
for (count = aStartIndex; count < size; count++)
{
link = iCharacterMetricsList[count];
frequency = link->Frequency();
if (frequency>frequencyOfMostPopular)
{
mostPopular = link->Metric();
frequencyOfMostPopular = frequency;
}
total += frequency;
}
return *mostPopular;
}
int MetricDistribution::Index(const CharacterMetrics& aMetrics)
{
boolean same = false;
CharacterMetrics* match = NULL;
int i;
int size = iCharacterMetricsList.Size();
// see if we have this one already
for (i = 0; i < size; i++)
{
if (iCharacterMetricsList[i])
{
match = iCharacterMetricsList[i]->Metric();
}
if ((match->iAscentInPixels == aMetrics.iAscentInPixels)
&& (match->iHeightInPixels == aMetrics.iHeightInPixels)
&& (match->iLeftAdjustInPixels == aMetrics.iLeftAdjustInPixels)
&& (match->iMoveInPixels == aMetrics.iMoveInPixels)
&& (match->iRightAdjustInPixels == aMetrics.iRightAdjustInPixels))
{
same = true;
break;
}
}
if (!same)
{
i = -1; // not found
}
return i;
}
void MetricDistribution::Externalize(ostream& out)
{
streamoff idOffset = iStreamId;
out.write(reinterpret_cast<char*>(&idOffset), sizeof(idOffset));
int32 numMetrics = iCharacterMetricsList.Size();
out.write(reinterpret_cast<char*>(&numMetrics), sizeof(numMetrics));
}
void MetricDistribution::ExternalizeComponents(ostream& out)
{
iStreamId = out.tellp();
iCharacterMetricsList.Externalize(out);
}
void Characters::Externalize(ostream& out)
{
iStreamId = out.tellp();
iBitmapOffsetList.Externalize(out);
}
Characters::~Characters()
{
iBitmapOffsetList.Destroy();
}
ByteList::ByteList()
: iString(), iOffset(0)
{
}
void ByteList::AddBit(char aBit)
{
if (iOffset > 7)
NewByte();
const char mask = 1;
aBit = char(aBit & mask);
char byte = char(aBit << iOffset);
int index = iString.Length() - 1;
iString[index] = char(iString[index] | byte);
iOffset++;
}
void ByteList::NewByte()
{
char byte = 0;
iString += byte;
iOffset = 0;
}
int ByteList::Length() const
{
return iString.Length();
}
void ByteList::Externalize(ostream& out)
{
int32 length = iString.Length();
out.write((char*) &length, sizeof(length));
out.write(iString.Text(), length);
}
void CharactersBitmap::Externalize(ostream& out)
{
iStreamId = out.tellp();
iByteList.Externalize(out);
}
void CharactersBitmap::AddIndex(int aIndex)
{// Add index to metrics into the bitmap code section
// Use 1 byte for most popular indices, 2 bytes otherwise
int power;
if (aIndex < KNumberOfPopularIndices)
{
iByteList.AddBit(0);
power = KNumberOfBitsInByte - 1;
}
else
{
iByteList.AddBit(1);
power = KNumberOfBitsInTwoBytes - 1;
}
char sigBit = 0;
// Add significant bits of index.
for(int bitToAdd = 0; bitToAdd < power; bitToAdd++)
{
sigBit = char(aIndex >> bitToAdd);
iByteList.AddBit(sigBit);
}
}
void BitmapCodeSection::Externalize(ostream& out)
{
out.write((char*) &iStart, sizeof(iStart));
out.write((char*) &iEnd, sizeof(iEnd));
streamoff idOffset = iCharacters.iStreamId;
out.write(reinterpret_cast<char*>(&idOffset), sizeof(idOffset));
idOffset = iCharactersBitmap.iStreamId;
out.write(reinterpret_cast<char*>(&idOffset), sizeof(idOffset));
}
void BitmapCodeSection::ExternalizeComponents(ostream& out)
{
iCharacters.Externalize(out);
iCharactersBitmap.Externalize(out);
}
FontBitmap::FontBitmap()
: iPosture(PostureUpright),
iStrokeWeight(StrokeWeightNormal),
iIsProportional(efalse),
iCellHeightInPixels(0),
iAscentInPixels(0),
iMaxCharWidthInPixels(0),
iMaxNormalCharWidthInPixels(0),
iBitmapEncoding(0)
{
iCharacterMetrics = MetricDistribution::New();
}
void FontBitmap::Externalize(ostream& out)
{
iStreamId = out.tellp();
out.write((char*) &iUid, sizeof(iUid));
out.put((char) iPosture);
out.put((char) iStrokeWeight);
out.put((char) iIsProportional);
out.write((char*) &iCellHeightInPixels, sizeof(iCellHeightInPixels));
out.write((char*) &iAscentInPixels, sizeof(iAscentInPixels));
out.write((char*) &iMaxCharWidthInPixels, sizeof(iMaxCharWidthInPixels));
out.write((char*) &iMaxNormalCharWidthInPixels, sizeof(iMaxNormalCharWidthInPixels));
out.write((char*) &iBitmapEncoding, sizeof(iBitmapEncoding));
iCharacterMetrics->Externalize(out);
iCodeSectionList.Externalize(out);
}
void FontBitmap::ExternalizeComponents(ostream& out)
{
// write out characters and chactersbitmap records
iCharacterMetrics->ExternalizeComponents(out);
int size = iCodeSectionList.Size();
for (int i = 0; i < size; i++)
{
iCodeSectionList[i]->ExternalizeComponents(out);
}
}
FontBitmap::~FontBitmap()
{
iCodeSectionList.Destroy();
delete iCharacterMetrics;
}
TypefaceFontBitmap::TypefaceFontBitmap(FontBitmap* aFontBitmap)
: iFontBitmap(aFontBitmap),
iFontBitmapUid(KNullUid),
iWidthFactor(1),
iHeightFactor(1)
{
}
TypefaceFontBitmap::TypefaceFontBitmap(uid aFontBitmapUid)
: iFontBitmap(NULL),
iFontBitmapUid(aFontBitmapUid),
iWidthFactor(1),
iHeightFactor(1)
{
}
void TypefaceFontBitmap::Externalize(ostream& out)
{
if (iFontBitmap)
out.write((char*) &iFontBitmap->iUid, sizeof(iFontBitmap->iUid));
else
out.write((char*) &iFontBitmapUid, sizeof(iFontBitmapUid));
out.write((char*) &iWidthFactor, sizeof(iWidthFactor));
out.write((char*) &iHeightFactor, sizeof(iHeightFactor));
}
void FntTypeface::Externalize(ostream& out)
{
iStreamId = out.tellp();
Typeface::Externalize(out);
iTypefaceFontBitmapList.Externalize(out);
}
FontStoreFile::FontStoreFile()
: iCollectionUid(KNullUid),
iKPixelAspectRatio(1000),
iCopyrightInfo(),
iDataStreamId(0)
{
}
void FontStoreFile::AddTypeface(FntTypeface *aTypeface)
{
iTypefaceList.Add(aTypeface);
for (int i = 0; i < aTypeface->iTypefaceFontBitmapList.Size(); i++)
{
if (aTypeface->iTypefaceFontBitmapList[i]->iFontBitmap)
iFontBitmapList.Add(aTypeface->iTypefaceFontBitmapList[i]->iFontBitmap);
}
}
void FontStoreFile::AddFontBitmap(FontBitmap* aFontBitmap)
{
iFontBitmapList.Add(aFontBitmap);
}
void FontStoreFile::Externalize(ostream& out)
{
ExternalizeHeader(out);
ExternalizeComponents(out);
}
void FontStoreFile::ExternalizeHeader(ostream& out)
{
out.write((char*) &KStoreWriteOnceLayoutUid, sizeof(KStoreWriteOnceLayoutUid));
out.write((char*) &KFontStoreFileUid, sizeof(KFontStoreFileUid));
out.write((char*) &KNullUid, sizeof(KNullUid));
out.write((char*) &KFontStoreFileChecksum, sizeof(KFontStoreFileChecksum));
streamoff idOffset = iStreamId;
out.write(reinterpret_cast<char*>(&idOffset), sizeof(idOffset));
iStreamId = out.tellp();
out.write((char*) &KFnttranVersion, sizeof(KFnttranVersion));
out.write((char*) &iCollectionUid, sizeof(iCollectionUid));
out.write((char*) &iKPixelAspectRatio, sizeof(iKPixelAspectRatio));
idOffset = iDataStreamId;
out.write(reinterpret_cast<char*>(&idOffset), sizeof(idOffset));
iCopyrightInfo.Externalize(out);
}
void FontStoreFile::ExternalizeComponents(ostream& out)
{
iDataStreamId = out.tellp();
iFontBitmapList.Externalize(out);
iTypefaceList.Externalize(out);
iFontBitmapList.ExternalizeComponents(out);
}
boolean FontStore::Store(const String& aFilename)
{
boolean state = efalse;
ofstream fout;
String string = aFilename;
fout.open(string.Text(), ios::binary);
if (!fout.fail())
{
iFontStoreFile->Externalize(fout);
fout.close();
fout.open(string.Text(), ios::binary | ios::trunc);
iFontStoreFile->Externalize(fout);
fout.close();
state = etrue;
}
return state;
}
void FontStore::AddFontStoreFile(FontStoreFile* aFontStoreFile)
{
iFontStoreFile = aFontStoreFile;
}
void FontStore::AddFontBitmap(FontBitmap *aFontBitmap)
{
iFontBitmapList.Add(aFontBitmap);
}
Record* FontStore::FindFontBitmap(String& aLabel)
{
return iFontBitmapList.LabelToRecord(aLabel);
}
void FontStore::AddTypeface(FntTypeface *aTypeface)
{
iTypefaceList.Add(aTypeface);
}
Record* FontStore::FindTypeface(String& aLabel)
{
return iTypefaceList.LabelToRecord(aLabel);
}
FontStore::FontStore()
: iFontStoreFile(NULL),
iFontBitmapList(),
iTypefaceList()
{
}
FontStore::~FontStore()
{
delete iFontStoreFile;
iFontBitmapList.Destroy();
iTypefaceList.Destroy();
}