diff -r 000000000000 -r 5d03bc08d59c graphicstools/gdi_tools/fontcomp/GDSFCOMP.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graphicstools/gdi_tools/fontcomp/GDSFCOMP.CPP Tue Feb 02 01:47:50 2010 +0200 @@ -0,0 +1,231 @@ +// 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: +// + +#include "GDSFCOMP.H" +#include "toolsver.h" + +int GdsFontCompiler::WriteFont() + { + int index=0; + index=WriteHeader(); + if(index<0) return(index); + for(int ch=index;chn_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;yheight;y++) + { + memcpy(srcBuf,iFontSpace+fChar->offset+y*fChar->ByteWid,fChar->ByteWid); + pSrc=&srcBuf[0]; + bit=1; + int pb=0; + for(int i=0;iwidth;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;i5) + { + 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); + } +