diff -r 000000000000 -r f58d6ec98e88 gfxtools/gditools/fontcomp/FSC.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gfxtools/gditools/fontcomp/FSC.CPP Thu Dec 17 09:14:18 2009 +0200 @@ -0,0 +1,337 @@ +/* +* 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 "FONTCOMP.H" + +FscRead::FscRead(fstream& aFile,FontCompiler& aFontCompiler,Fxf* aFxf): + FontRead(aFile,aFontCompiler,aFxf) + {} + +int FscRead::DoCom(int aSecondPass) +/* +Takes a command and takes appropriate action +Returns -ve if an error occured + 0 for OKAY + +ve number for new current character number +*/ + { + int ret=0,num=0,neg=0; + int i=0; + for (;i='0' && chr<='9') + num=num*10+chr-'0'; + } + if (neg) + num= -num; + if (iInputBuf[1]=='c') + return(num); + if (aSecondPass) + ret=0; + else switch(iInputBuf[1]) + { + case 'd': + iFxf->descent=num; + break; + case 'a': + iFxf->nominal_ascent=num; + break; + case 'm': + iFxf->max_info_width=num; + break; + case 'h': + if ((iFxf->cell_height=num)>MAX_HEIGHT) + ret=Parameter; + if (iFxf->nominal_ascent==0) + iFxf->nominal_ascent=iFxf->cell_height-iFxf->descent; + break; + case 'n': /* Font data label name */ + { + int pos=0; + while(iInputBuf[pos]!=' ') + pos++; + while(iInputBuf[pos]==' ') + pos++; + if(iInputBufLen-pos>FONT_NAME_LEN) + return(FileFormat); + memcpy(iFxf->name,&iInputBuf[pos],iInputBufLen-pos); + (iFxf->name)[iInputBufLen-pos]=0; + } + break; + case 't': /* Font data typeface */ + { + int pos=0; + while(iInputBuf[pos]!=' ') + pos++; + while(iInputBuf[pos]==' ') + pos++; + if(iInputBufLen-pos>FONT_NAME_LEN) + return(FileFormat); + memcpy(iFxf->typeface,&iInputBuf[pos],iInputBufLen-pos); + (iFxf->typeface)[iInputBufLen-pos]=0; + } + break; + case 'b': + iFxf->iBold=1; + break; + case 'i': + iFxf->iItalic=1; + break; + case 'f': + // not a lot + break; + case 'v': + iFxf->iUid=num; + break; + case 'o': + iOverHang=num; + break; + case 'u': + iUnderHang=num; + break; + default: + ret=FileFormat; + break; + } + return(ret); + } + +char* FscRead::ScanLine(int& aLen) +/* Scan the input line for the first '0' or '1' character and return a descriptor pointing to it, +returns a zero length descriptor if not found. +*/ + { + aLen=0; + if((iInputBuf[0]!='0' && iInputBuf[0]!='1') || iInputBufLen==0) + return(NULL); + while(iInputBuf[aLen]=='0' || iInputBuf[aLen]=='1') + aLen++; + return(iInputBuf); + } + + +int FscRead::ReadLine() + { + int pos=0; + while(iFileBuf[iFileBufPos+pos]!='\n' && iFileBufPos+pos=iFileBufLen) return(1); + return(0); + } + +FontRead::FontRead(fstream& aFile,FontCompiler& aFontCompiler,Fxf* aFxf): + iInputFile(aFile), + iFontCompiler(&aFontCompiler), + iFxf(aFxf) + { + } + +int FscRead::ReadFont() + { + iInputFile.seekg(0,ios::end); + iFileBufLen=iInputFile.tellg(); + iInputFile.seekg(0); + iFileBufPos=0; + iFileBuf=new char[iFileBufLen]; + iInputFile.read(iFileBuf,iFileBufLen); + int ret=Pass1(); + if(ret) return(ret); + return(Pass2()); + } + +int FscRead::Pass1() + { + int n_row=0; // counts row in character picture + int ret=0; + int specChr=0; + int isCharBody=0; + int lastLine=0; + int widthofi=0; + int widthofM=0; + + iFxf->MaxChrWidth=0; + iFxf->cell_height=0; + iFxf->UlinePos=0; + iFxf->UlineThickness=0; + iFxf->nominal_ascent=0; + iFxf->descent=0; + iFxf->chr_seg=0; + iFxf->FirstChr=0; + iFxf->n_chars=0; + iFxf->max_info_width=0; + iFxf->flags=0; + iFxf->special=0; + iFxf->ByteWid=0; + iFxf->UseWords=0; + iFxf->iBold=0; + iFxf->iItalic=0; + iFxf->iProportional=0; + iFxf->iSerif=0; + iFxf->iSymbol=0; + iFxf->iUid=0; + + iUnderHang=0; + iOverHang=0; + iChar=new FcmCharHead[MAX_CHARS]; + for(int letter=0;letterchr[letter]=NULL; +//************************************************** +// First pass. Read header info & character widths * +//************************************************** + do + { + int width=0; // width of current character picture + + lastLine=ReadLine(); + isCharBody=0; + if (iInputBufLen>0 && iInputBuf[0]=='*') + { + if ((ret=DoCom(0))<0) + return(FileFormat); + else if (ret) + { + for(;iFxf->n_charsn_chars++) + iFxf->chr[iFxf->n_chars]=NULL; + specChr=iFxf->n_chars; + } + } + else + { + int len=0; + char* ptr=ScanLine(len); + if (len) + { + isCharBody=1; + if (iFxf->FirstChr<0) + iFxf->FirstChr=iFxf->n_chars; + if (n_row==0) + { + for (width=0;widthn_chars>255) + return(FileFormat); + iFxf->chr[iFxf->n_chars]=iChar; + iFxf->n_chars++; + iChar->xOffset= -iUnderHang; + iChar->width=width; + iChar->ByteWid=((iChar->width+15)>>3)&(~1); + iChar->move=width-iUnderHang-iOverHang; + if(iFxf->n_chars=='i') + widthofi=iChar->move; + else if(iFxf->n_chars=='M') + widthofM=iChar->move; + iUnderHang=0; + iOverHang=0; + if (width>iFxf->MaxChrWidth) + iFxf->MaxChrWidth=width; + } + n_row++; + } + } + if ((n_row!=0 && !isCharBody) || (lastLine && isCharBody)) + { + if (n_row>iFxf->cell_height) + return(FileFormat); + iChar->height=n_row; + iChar->yOffset=iFxf->cell_height-iFxf->descent; + specChr++; + n_row=0; + width=0; + iChar++; + } + } while(!lastLine); + if (iFxf->cell_height==0) + return(FileFormat); + if(widthofi && widthofM) + iFxf->iProportional=(widthofi!=widthofM); + return(NoError); + } + +int FscRead::Pass2() +/******************************************************/ +/* Second pass. Read in actual picture data this time */ +/******************************************************/ + { + unsigned int bit; // Used to set bits in pic + int ret,chNum; + int n_row; // counts row in character picture + int offset=0; + int isCharBody; + int lastLine; + + iFileBufPos=0; + n_row=0; + chNum=0; + do { + lastLine=ReadLine(); + isCharBody=0; + if (iInputBufLen>0 && iInputBuf[0]=='*') + { + if ((ret=DoCom(1))>0) + { + if (retchr[chNum]; + chNum++; + } + unsigned short int* pDest=(unsigned short int*)(iFontCompiler->FontStore()+offset+iChar->ByteWid*n_row); + bit=1; + *pDest=0; + for (int width=0;widthoffset=offset; + offset+=iChar->ByteWid*n_row; + n_row=0; + } + } while(!lastLine); + return(NoError); + }