gfxtools/gditools/fontcomp/GDSFCOMP.CPP
changeset 0 f58d6ec98e88
child 6 2013ebce6d92
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gfxtools/gditools/fontcomp/GDSFCOMP.CPP	Thu Dec 17 09:14:18 2009 +0200
@@ -0,0 +1,234 @@
+/*
+* Copyright (c) 1997-2007 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:
+*
+*/
+
+
+#include "GDSFCOMP.H"
+#include "TOOLSVER.H"
+
+int GdsFontCompiler::WriteFont()
+	{
+	int index=0;
+	index=WriteHeader();
+	if(index<0) return(index);
+	for(int ch=index;ch<iFxf->n_chars;ch++)
+		WriteCharData(ch);
+	WriteFooter();
+	return(NoError);
+	}
+
+int GdsFontCompiler::WriteHeader()
+	{
+	int mncw=0;
+	for(char letter='A';letter<='Z';letter++)
+		{
+		FcmCharHead* fChar=iFxf->chr[letter];
+		if(fChar)
+			{
+			int letterwidth=fChar->move;
+			if(letterwidth>mncw)
+				mncw=letterwidth;
+			}
+		}
+	WriteFormattedData("FontBitmap ");
+	WriteFormattedData(iFxf->name,1);
+	WriteFormattedData("Uid ");
+	WriteFormattedData(iFxf->iUid);
+	if(iFxf->iBold)
+		WriteFormattedData(" Bold");
+	if(iFxf->iItalic)
+		WriteFormattedData(" Italic");
+	if(iFxf->iProportional)
+		WriteFormattedData(" Proportional");
+	if(iFxf->iSerif)
+		WriteFormattedData(" Serif");
+	if(iFxf->iSymbol)
+		WriteFormattedData(" Symbol");
+	WriteNewLine();
+	WriteFormattedData("MaxNormalCharWidth ");
+	WriteFormattedData(mncw,1);
+	WriteFormattedData("CellHeight ");
+	WriteFormattedData(iFxf->cell_height,1);
+	WriteFormattedData("Ascent ");
+	WriteFormattedData(iFxf->nominal_ascent,1);
+//	WriteFormattedData("Uline ");
+//	WriteFormattedData(iFxf->UlinePos,0);
+//	WriteFormattedData(" ");
+//	WriteFormattedData(iFxf->UlineThickness,1);
+	int index=0;
+	while(!iFxf->chr[index])
+		index++;
+	if(index>=iFxf->n_chars)
+		return(FileFormat);
+	WriteFormattedData("CodeSection ");
+	WriteFormattedData(index,0);
+	WriteFormattedData(":");
+	WriteFormattedData(iFxf->n_chars-1,1);
+	return(index);
+	}
+
+void GdsFontCompiler::WriteFooter()
+	{
+	WriteFormattedData("EndCodeSection",1);
+	WriteFormattedData("EndFontBitmap",1);
+	WriteNewLine();
+	}
+
+void GdsFontCompiler::WriteCharData(int charnum)
+	{
+	unsigned short int* pSrc;
+	unsigned short int bit;
+	char buf[10+MAX_CHAR_WID];
+	unsigned short int srcBuf[(MAX_CHAR_WID+15)>>4];
+
+	const FcmCharHead* fChar=iFxf->chr[charnum];
+	WriteNewLine();
+	WriteFormattedData("Char ");
+	WriteFormattedData(charnum);
+	if(fChar==NULL)
+		{
+		WriteNewLine();
+		WriteFormattedData("EndChar",1);
+		return;
+		}
+	WriteFormattedData(" Adjust ");
+
+	int bitwid=fChar->move+(fChar->xOffset<0?-fChar->xOffset:0);
+	const int ohang=fChar->move-fChar->xOffset-fChar->width;
+	WriteFormattedData(fChar->xOffset);
+	WriteFormattedData(" ");
+	WriteFormattedData(ohang);
+	bitwid+=ohang;
+	if (charnum>31)
+		{
+		WriteFormattedData("  ! '");
+		WriteFormattedData((char*)&charnum);
+		WriteFormattedData("'");
+		}
+	WriteNewLine();
+	if (fChar->width!=0)
+		{
+		WriteBlankLines(iFxf->cell_height-iFxf->descent-fChar->yOffset,fChar->width);
+		for(int y=0;y<fChar->height;y++)
+			{
+			memcpy(srcBuf,iFontSpace+fChar->offset+y*fChar->ByteWid,fChar->ByteWid);
+			pSrc=&srcBuf[0];
+			bit=1;
+			int pb=0;
+			for(int i=0;i<fChar->width;i++)
+				{
+				buf[pb++]=((*pSrc)&bit)?SetPixel:BlankPixel;
+				bit<<=1;
+				if(!bit)
+					{
+					bit=1;
+					pSrc++;
+					}
+				}
+			buf[pb]=0;
+			WriteFormattedData(buf,1);
+			}
+		WriteBlankLines(iFxf->descent+fChar->yOffset-fChar->height,fChar->width);
+		}
+	WriteFormattedData("EndChar",1);
+	}
+
+void GdsFontCompiler::WriteBlankLines(int num,int width)
+	{
+	char buf[2+MAX_CHAR_WID+20];
+	memset(&buf[0],BlankPixel,width);
+	buf[width] ='\0';
+	for(int i=0;i<num;i++)
+		WriteFormattedData(buf,1);
+	}
+
+void GdsFontCompiler::WriteFormattedData(char* aData,int aNewLine)
+	{
+	if(aData)
+		iOutputFile << aData;
+	if(aNewLine)
+		WriteNewLine();
+	}
+
+void GdsFontCompiler::WriteFormattedData(int aNum,int aNewLine)
+	{
+	char numbuf[16];
+	_itoa(aNum,numbuf,10);
+	WriteFormattedData(numbuf,aNewLine);
+	}
+
+void GdsFontCompiler::WriteNewLine()
+	{
+	iOutputFile << "\n";
+	}
+
+int main(int argc,char *argv[])
+    {
+	if(argc<3 || argc>5)
+		{
+		cout << "\n";
+		cout << "FONTCOMP Version 0.01(" << version << ")\n";
+		cout << "\n";
+		cout << "USAGE: FONTCOMP srcfile destfile [/e [mapfile]|/f]\n";
+		cout << "Where srcfile is the file to be processed,\n";
+		cout << "destfile is the file to be created,\n";
+		cout << "/e specifies EFF format (default) and /f\n";
+		cout << "specifies FSC format.  If the format is EFF then\n";
+		cout << "the optional mapfile may be used for altenative\n";
+		cout << "character sets.\n\n";
+		return(0);
+		}
+	FontType type=EFontTypeEff;
+	if(argc==4)
+		if(argv[3][1]=='f' || argv[3][1]=='F')
+			type=EFontTypeFsc;
+	char* mapfile=NULL;
+	if(argc==5) mapfile=argv[4];
+	GdsFontCompiler fontcomp;
+	int ret=fontcomp.Init(argv[1],argv[2],mapfile);
+	if(ret==NoError)
+		ret=fontcomp.Read(type);
+	if(ret==NoError)
+		fontcomp.RemoveBlankSpace();
+	if(ret==NoError)
+		ret=fontcomp.WriteFont();
+	switch(ret)
+		{
+		case NoError:
+			cout << "Success\n\n";
+			break;
+		case NoMemory:
+			cout << "Out of memory\n\n";
+			break;
+		case NoFile:
+			cout << "File does not exist\n\n";
+			break;
+		case FileRead:
+			cout << "File read error\n\n";
+			break;
+		case FileWrite:
+			cout << "File write error\n\n";
+			break;
+		case FileFormat:
+			cout << "File has wrong format\n\n";
+			break;
+		case Parameter:
+			cout << "Bad parameter\n\n";
+			break;
+		}
+	return(ret);
+    }
+