示例#1
0
文件: OrgOp.cpp 项目: eriser/es
bool COrgOp::Decode_GetNextLine( CStr &roDst, CStr &roSrc ) const
{
	int j;

	j = roSrc.Find( 0, ORG_OP_DELIM );
	if( j < 0 )
		return false;
	roSrc.Del( 0, ++j );

	j = roSrc.Find( 0, ORG_OP_NEWLINE );
	if( j < 0 )
		return false;
	roDst = roSrc.GetSub( 0, j );
	roSrc.Del( 0, j+sizeof( ORG_OP_NEWLINE ) );
	ORG_OP_LOG( "line: %s\n", roDst.GetData() );
	return true;
}
示例#2
0
文件: OrgOp.cpp 项目: eriser/es
bool COrgOp::Decode_GetNextToken( CStr &roDst, CStr &roSrc ) const
{
	int j = roSrc.Find( 0, ORG_OP_DELIM );
	if( j < 0 )
		return false;
	roDst = roSrc.GetSub( 0, j );
	roSrc.Del( 0, j+1 ); // ORG_OP_DELIM auch löschen
	ORG_OP_LOG( "token: %s\n", roDst.GetData() );
	return true;
}
示例#3
0
bool CPrsBDF::RemoveLeadingSpace( CStr &roStr )
{
	static const char *acSpace_ = " \t";
	int iPos = roStr.FindVecInv( 0, acSpace_ );
	if( iPos >= 0 )
	{
		roStr.Del( 0, iPos );
		return true;
	}
	return false;
}
示例#4
0
bool CPrsBDF::RemoveNextWord( CStr &roStr )
{
	if( !roStr.GetSize() )
		return false;
	static const char *acSpace_ = " \t";
	RemoveLeadingSpace( roStr );
	int iPos = roStr.FindVec( 0, acSpace_ );
	if( iPos < 0 )
		iPos = roStr.GetSize();
	roStr.Del( 0, iPos );
	RemoveLeadingSpace( roStr );
	return true;
}
示例#5
0
bool CPrsBDF::Parse( const char *pcFont )
{
#define TOK(T) TPairTokenNameID( #T, PBDF_TOKEN_##T )
	static const TPairTokenNameID m_aoToken_[] = 
	{
		TOK( STARTFONT ),
		TOK( COMMENT ),
		TOK( CONTENTVERSION ),
		TOK( FONT ),
		TOK( SIZE ),
		TOK( FONTBOUNDINGBOX ),
		TOK( METRICSSET ),
		TOK( SWIDTH ),
		TOK( DWIDTH ),
		TOK( SWIDTH1 ),
		TOK( DWIDTH1 ),
		TOK( VVECTOR ),
		TOK( STARTPROPERTIES ),
		TOK( ENDPROPERTIES ),
		TOK( CHARS ),
		TOK( STARTCHAR ),
		TOK( ENCODING ),
		TOK( BBX ),
		TOK( BITMAP ),
		TOK( ENDCHAR ),
		TOK( ENDFONT )
	};
	static const unsigned int uiTokenNum = sizeof( m_aoToken_ ) / sizeof( TPairTokenNameID );
	CStr oStrFontFile( pcFont );
	const int iFontSize = oStrFontFile.GetSize();
	int iPropertiesStartPos = -1;
	CGlyph oGylphNew;
	CGlyph *poGlyph = &m_oGlyphDefault;
	bool bIsReadingChar = false;
	
	Reset();
	
	PBDF_LOG( "parse: start\n" );
	
	int iPos = 0;
	while( iPos < iFontSize )
	{
		int iEndOfLine = oStrFontFile.Find( iPos, PBDF_NEWLINE );
		if( iEndOfLine < 0 )
			iEndOfLine = iFontSize;
		
		CStr oStrLine = oStrFontFile.GetSub( iPos, iEndOfLine - iPos );
		RemoveLeadingSpace( oStrLine );
		
		//PBDF_LOG( "line: %s", oStrLine.GetData() );
		//PBDF_LOG( "line_size: %s", oStrLine.GetSize() );
		
		unsigned int uiTokenNext = PBDF_TOKEN_NONE;
		
		for( unsigned int t=0; t<uiTokenNum; ++t )
		{
			CStr oStrToken = m_aoToken_[t].GetFirst() ;
			const unsigned int uiTokenSize = oStrToken.GetSize();
			
			//PBDF_LOG( "token: %s", oStrToken.GetData() );
			
			int iPosToken = oStrLine.Find( 0, oStrToken );
			if( iPosToken != 0 ) 
				continue;
			
			// Danach müssen Leerzeichen oder das Ende folgen!
			const unsigned int uiPosNext = iPosToken + uiTokenSize;
			if( uiPosNext < oStrLine.GetSize() )
			{
				const char cNext = oStrLine[ uiPosNext ];
				if( !( cNext == ' ' || cNext == '\t' ) )
					continue;
			}
			
			if( iPosToken >= 0 )
			{
				oStrLine.Del( 0, uiTokenSize );
				RemoveLeadingSpace( oStrLine );
				uiTokenNext = m_aoToken_[t].GetSecond();
				PBDF_LOG( "token: %s\n", oStrToken.GetData() );
				break;
			}
		}
		
		if( uiTokenNext != PBDF_TOKEN_NONE )
		{
			switch( uiTokenNext )
			{
			case PBDF_TOKEN_STARTFONT:
				ReadValue( oStrLine, &m_dVersion );
				PBDF_LOG( "version: %g\n", m_dVersion );
			break;
			case PBDF_TOKEN_COMMENT:
			break;
			case PBDF_TOKEN_CONTENTVERSION: // optional
				ReadValue( oStrLine, &m_iContentVersion );
				PBDF_LOG( "content_version: %d\n", m_iContentVersion );
			break;
			case PBDF_TOKEN_FONT:
				ReadValue( oStrLine, &m_oStrFont );
				PBDF_LOG( "font: %s\n", m_oStrFont.GetData() );
			break;
			case PBDF_TOKEN_SIZE:
				ReadValue( oStrLine, &m_iPointSize );
				PBDF_LOG( "point_size: %d\n", m_iPointSize );
				RemoveNextWord( oStrLine );
				ReadValue( oStrLine, &m_iResX );
				PBDF_LOG( "res_x: %d\n", m_iResX );
				RemoveNextWord( oStrLine );
				ReadValue( oStrLine, &m_iResY );
				PBDF_LOG( "res_y: %d\n", m_iResY );
			break;
			case PBDF_TOKEN_FONTBOUNDINGBOX:
				ReadValue( oStrLine, &m_iBBX );
				PBDF_LOG( "bounding_box_x: %d\n", m_iBBX );
				RemoveNextWord( oStrLine );
				ReadValue( oStrLine, &m_iBBY );
				PBDF_LOG( "bounding_box_y: %d\n", m_iBBY );
				RemoveNextWord( oStrLine );
				ReadValue( oStrLine, &m_iOffX );
				PBDF_LOG( "offset_y: %d\n", m_iOffX );
				RemoveNextWord( oStrLine );
				ReadValue( oStrLine, &m_iOffY );
				PBDF_LOG( "offset_x: %d\n", m_iOffY );
				RemoveNextWord( oStrLine );
			break;
			case PBDF_TOKEN_METRICSSET: // optional
				ReadValue( oStrLine, &m_iMetricsSet );
				PBDF_LOG( "metrics_set: %d\n", m_iMetricsSet );
			break;
			case PBDF_TOKEN_SWIDTH:
				ReadValue( oStrLine, &poGlyph->m_dSX );
				PBDF_LOG( "sx: %g\n", poGlyph->m_dSX );
				RemoveNextWord( oStrLine );
				ReadValue( oStrLine, &poGlyph->m_dSY );
				PBDF_LOG( "sy: %g\n", poGlyph->m_dSY );
			break;
			case PBDF_TOKEN_DWIDTH:
				ReadValue( oStrLine, &poGlyph->m_iDX );
				PBDF_LOG( "dx: %d\n", poGlyph->m_iDX );
				RemoveNextWord( oStrLine );
				ReadValue( oStrLine, &poGlyph->m_iDY );
				PBDF_LOG( "dy: %d\n", poGlyph->m_iDY );
			break;
			case PBDF_TOKEN_SWIDTH1:
				ReadValue( oStrLine, &poGlyph->m_dSX1 );
				PBDF_LOG( "sx1: %g\n", poGlyph->m_dSX1 );
				RemoveNextWord( oStrLine );
				ReadValue( oStrLine, &poGlyph->m_dSY1 );
				PBDF_LOG( "sy1: %g\n", poGlyph->m_dSY1 );
			break;
			case PBDF_TOKEN_DWIDTH1:
				ReadValue( oStrLine, &poGlyph->m_iDX1 );
				PBDF_LOG( "dx1: %d\n", poGlyph->m_iDX1 );
				RemoveNextWord( oStrLine );
				ReadValue( oStrLine, &poGlyph->m_iDY1 );
				PBDF_LOG( "dy1: %d\n", poGlyph->m_iDY1 );
			break;
			case PBDF_TOKEN_VVECTOR: // optional
				ReadValue( oStrLine, &poGlyph->m_dVVX );
				PBDF_LOG( "vvx: %g\n", poGlyph->m_dVVX );
				RemoveNextWord( oStrLine );
				ReadValue( oStrLine, &poGlyph->m_dVVY );
				PBDF_LOG( "vvy: %g\n", poGlyph->m_dVVY );
			break;
			case PBDF_TOKEN_STARTPROPERTIES: // optional
				ReadValue( oStrLine, &m_iProperties );
				PBDF_LOG( "properties: %d\n", m_iProperties );
				iPropertiesStartPos = iEndOfLine + 1;
			break;
			case PBDF_TOKEN_ENDPROPERTIES: // optional
				if( iPropertiesStartPos < 0 )
					break;
				m_oStrProperties = oStrFontFile.GetSub( 
					iPropertiesStartPos, iPos - iPropertiesStartPos );
				PBDF_LOG( "properties:\n%s\n", m_oStrProperties.GetData() );
			break;
			case PBDF_TOKEN_CHARS:
				ReadValue( oStrLine, &m_iChars );
				PBDF_LOG( "chars: %d\n", m_iChars );
				
				poGlyph = &oGylphNew;
			break;
			case PBDF_TOKEN_STARTCHAR:
				if( bIsReadingChar )
				{
					PBDF_ERROR( "glyph %s\n", oStrLine.GetData() );
					return false;
				}
				bIsReadingChar = true;
				
				oGylphNew = m_oGlyphDefault;
				ReadValue( oStrLine, &poGlyph->m_oStrName );
				PBDF_LOG( "char_name: %s\n", poGlyph->m_oStrName.GetData() );
				PBDF_LOG( "char_num: %d\n", m_oArrGlyph.GetSize() );
			break;
			case PBDF_TOKEN_ENCODING:
				ReadValue( oStrLine, &poGlyph->m_iEncoding0  );
				PBDF_LOG( "encoding0: %d\n", poGlyph->m_iEncoding0 );
				RemoveNextWord( oStrLine );
				if( !oStrLine.GetSize() )
					break;
				ReadValue( oStrLine, &poGlyph->m_iEncoding1 );
				PBDF_LOG( "encoding1: %d\n", poGlyph->m_iEncoding1 );
			break;
			case PBDF_TOKEN_BBX:
				ReadValue( oStrLine, &poGlyph->m_iBBX );
				PBDF_LOG( "bbx: %d\n", poGlyph->m_iBBX );
				RemoveNextWord( oStrLine );
				ReadValue( oStrLine, &poGlyph->m_iBBY );
				PBDF_LOG( "bby: %d\n", poGlyph->m_iBBY );
				RemoveNextWord( oStrLine );
				ReadValue( oStrLine, &poGlyph->m_iBBOffX );
				PBDF_LOG( "bb_off_x: %d\n", poGlyph->m_iBBOffX );
				RemoveNextWord( oStrLine );
				ReadValue( oStrLine, &poGlyph->m_iBBOffY );
				PBDF_LOG( "bb_off_y: %d\n", poGlyph->m_iBBOffY );
			break;
			case PBDF_TOKEN_BITMAP:
			{
				CArray<unsigned char> oArrBitmap;
				const int iHeight = poGlyph->m_iBBY;
				
				// Da hier sowieso kein Token folgt, kann ohne weiteres
				// auch über das Zeilenende hinaus gearbeitet werden.
				int iPosBegin = iEndOfLine + 1;
				int l = 0;
				
				poGlyph->m_oArrBitmap.Clear();
				
				while( l < iHeight )
				{
					const int iEOL = oStrFontFile.Find( iPosBegin, PBDF_NEWLINE ); 
					if( iEOL < 0 )
						break;
					CStr oCodeLine = oStrFontFile.GetSub( iPosBegin, iEOL - iPosBegin );
					ReadValue( oCodeLine, &oArrBitmap );
					poGlyph->m_oArrBitmap.Append( oArrBitmap );
					iPosBegin = iEOL + 1;
					++l;
				}		
			}
			break;
			case PBDF_TOKEN_ENDCHAR:
				m_oArrGlyph.Append( oGylphNew );
				bIsReadingChar = false;
			break;
			case PBDF_TOKEN_ENDFONT:
				PBDF_LOG( "glyph_count: %d\n", m_oArrGlyph.GetSize() );
				if( m_oArrGlyph.GetSize() != (unsigned int)m_iChars )
				{
					PBDF_ERROR( "glyph_cout: %d != %d", m_oArrGlyph.GetSize(), m_iChars );
					return false;
				}
			break;
			};
		}
		iPos = iEndOfLine + 1; // falls "\r\n"??
	}
	
	PBDF_LOG( "parse: end\n" );
	return true;
}