sl@0: // Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // sl@0: sl@0: #include "FONTCOMP.H" sl@0: sl@0: EffRead::EffRead(fstream& aFile,FontCompiler& aFontCompiler,Fxf* aFxf,short int* aMapSpace): sl@0: FontRead(aFile,aFontCompiler,aFxf), sl@0: iMapSpace(aMapSpace) sl@0: {} sl@0: sl@0: int EffRead::ReadFont() sl@0: { sl@0: int count=0; sl@0: int version=0; sl@0: char* outbuffer[(MAX_CHAR_WID+7)>>3]; sl@0: int bitpos,len1,len2; sl@0: int ReadSize,widToGo; sl@0: int widthofi=0; sl@0: int widthofM=0; sl@0: FcmCharHead* pFxf; sl@0: LetterTableData lettertabledata; sl@0: LetterData letterdata; sl@0: letterdata.blx = 0; sl@0: letterdata.bly = 0; sl@0: letterdata.rWid = 0; sl@0: letterdata.rHgt = 0; sl@0: int FileSize,FontNameOffs,VariousDataOffs,LetterOffs,LetterOffsBase,seekpos; sl@0: unsigned short int* pDest; sl@0: unsigned short int* pSrc; sl@0: EffVariousData VariousData; sl@0: sl@0: char* inBuffer=new char[((MAX_CHAR_WID+7)>>3)*MAX_HEIGHT]; sl@0: if(!inBuffer) return(NoMemory); sl@0: iInputFile.read((char*)&FileSize,4); sl@0: iInputFile.read((char*)&FontNameOffs,4); sl@0: iInputFile.read((char*)&VariousDataOffs,4); sl@0: iInputFile.read((char*)&VariousDataOffs,4); sl@0: iInputFile.read((char*)&LetterOffs,4); sl@0: iInputFile.seekg(FontNameOffs); sl@0: sl@0: char tmpName[FONT_NAME_LEN+1]; sl@0: iInputFile.read(tmpName,FONT_NAME_LEN); sl@0: tmpName[FONT_NAME_LEN]=0; sl@0: strcpy(iFxf->name,tmpName); sl@0: *(iFxf->typeface)=0; sl@0: sl@0: iInputFile.seekg(VariousDataOffs); sl@0: iInputFile.read((char*)&VariousData,sizeof(VariousData)); sl@0: version=VariousData.version; sl@0: if(version==0) version=1; sl@0: if(version!=1 && version!=2) return(FileFormat); sl@0: pFxf=new FcmCharHead[MAX_CHARS]; sl@0: for(count=0;countdescent= -VariousData.bly; sl@0: iFxf->UlinePos= -VariousData.UnderLinePos-VariousData.UnderLineThickness; sl@0: iFxf->UlineThickness=VariousData.UnderLineThickness; sl@0: iFxf->nominal_ascent=(VariousData.Hgt/*+VariousData.LineSpacing*/)-iFxf->descent; sl@0: iFxf->MaxChrWidth=0; sl@0: iFxf->cell_height=VariousData.Hgt; sl@0: for(unsigned int chNum=0;chNum>=4; sl@0: iInputFile.read((char*)&letterdata,sizeof(LetterData)); sl@0: LetterOffs+=sizeof(LetterData); sl@0: } sl@0: LetterOffs+=sizeof(LetterTableData); sl@0: iFxf->chr[chNum]=0; sl@0: // char 0 in EFF fonts have a garbage offset so ignore them. sl@0: // if(letterdata.offset) sl@0: if(lettertabledata.offset && chNum>0) sl@0: { sl@0: seekpos=LetterOffsBase+lettertabledata.offset; sl@0: iInputFile.seekg(seekpos); sl@0: if(version==2) sl@0: iInputFile.read((char*)&letterdata,sizeof(LetterData)); sl@0: if(first) sl@0: { sl@0: iFxf->FirstChr=chNum; sl@0: first=0; sl@0: } sl@0: iFxf->n_chars=chNum+1; sl@0: iFxf->chr[chNum]=pFxf; sl@0: pFxf->offset=offset; sl@0: pFxf->xOffset=letterdata.blx; sl@0: pFxf->yOffset=letterdata.rHgt+letterdata.bly; sl@0: pFxf->width=letterdata.rWid; sl@0: if(chNum=='i') sl@0: widthofi=pFxf->width; sl@0: if(chNum=='M') sl@0: widthofM=pFxf->width; sl@0: pFxf->ByteWid=((pFxf->width+15)>>3)&(~1); sl@0: pFxf->height=letterdata.rHgt; sl@0: pFxf->move=lettertabledata.width; sl@0: int chWid=letterdata.rWid; sl@0: if(chWid>iFxf->MaxChrWidth) sl@0: iFxf->MaxChrWidth=chWid; sl@0: ReadSize=(letterdata.rWid*letterdata.rHgt+7)>>3; sl@0: iInputFile.read(inBuffer,ReadSize); sl@0: bitpos=0; sl@0: pSrc=(unsigned short int*)inBuffer; sl@0: for(int i=0;iByteWid;j+=2) sl@0: { sl@0: len1=16-bitpos; sl@0: *pDest=(unsigned short int)((*pSrc)>>bitpos); sl@0: widToGo=letterdata.rWid-(j<<3); sl@0: if (len1>widToGo) sl@0: { sl@0: len1=widToGo; sl@0: len2=0; sl@0: } sl@0: else sl@0: { sl@0: pSrc++; sl@0: if ((len1+bitpos)>widToGo) sl@0: len2=widToGo-len1; sl@0: else sl@0: len2=bitpos; sl@0: if (len2) sl@0: *pDest|= (*pSrc)<<(16-bitpos); sl@0: } sl@0: *pDest&=0xFFFF>>(16-len2-len1); sl@0: bitpos=(bitpos+len1+len2)&0xF; sl@0: pDest++; sl@0: } sl@0: memcpy(iFontCompiler->FontStore()+offset+pFxf->ByteWid*(letterdata.rHgt-i-1),outbuffer,pFxf->ByteWid); sl@0: } sl@0: offset+=pFxf->ByteWid*letterdata.rHgt; sl@0: } sl@0: pFxf++; sl@0: } sl@0: if(widthofi && widthofM) sl@0: iFxf->iProportional=(widthofi!=widthofM); sl@0: return(NoError); sl@0: } sl@0: