Hi,

Thanks. Commited.

Cheers,
        Dominik

Am Dienstag 14 September 2010 schrieb Emad Steitieh:
> Hi,
> 
> I have improved DrawMultiLineText of PdfPainter little bit and the output
>  is better. Here is my updated version:
> 
> void PdfPainter::DrawMultiLineText( double dX, double dY, double dWidth,
>  double dHeight, const PdfString & rsText, EPdfAlignment eAlignment,
>  EPdfVerticalAlignment eVertical ) {
>     PODOFO_RAISE_LOGIC_IF( !m_pCanvas, "Call SetPage() first before doing
>  drawing operations." );
> 
>     if( !m_pFont || !m_pPage || !rsText.IsValid() )
>     {
>         PODOFO_RAISE_ERROR( ePdfError_InvalidHandle );
>     }
> 
>     // Peter Petrov 25 September 2008
>     m_pFont->EmbedFont();
> 
>     if( dWidth <= 0.0 || dHeight <= 0.0 ) // nonsense arguments
>         return;
> 
>     TLineElement              tLine;
>     std::vector<TLineElement> vecLines;
>     this->Save();
>     this->SetClipRect( dX, dY, dWidth, dHeight );
> 
>     PdfString   sString  = this->ExpandTabs( rsText,
>  rsText.GetCharacterLength() ); tLine.pszStart       = sString.GetString();
>     const char* pszEnd   = tLine.pszStart;
>     const char* pszWord  = tLine.pszStart;
> 
>     double dCurWidth = 0.0;
> 
>     // do simple word wrapping
>     // TODO: Use better algorithm!
>     while( *pszEnd )
>     {
>         dCurWidth += m_pFont->GetFontMetrics()->CharWidth( *pszEnd );
> 
>         if( *pszEnd == '\n' ) // hard-break!
>         {
>             ++pszEnd; // skip the line feed
> 
>             tLine.lLen = pszEnd - tLine.pszStart;
>             vecLines.push_back( tLine );
> 
>             tLine.pszStart = pszEnd;
>             dCurWidth = 0.0;
>         }
>         else if( isspace( static_cast<unsigned int>(static_cast<unsigned
>  char>(*pszEnd)) ) || ispunct( static_cast<unsigned
>  int>(static_cast<unsigned char>(*pszEnd)) )) pszWord = pszEnd;
> 
>         if( dCurWidth > dWidth )
>         {
>             // The last word does not fit anymore in the current line.
>             // -> Move it to the next one.
> 
>             // skip leading whitespaces!
>             while( *tLine.pszStart && isspace( static_cast<unsigned
>  int>(static_cast<unsigned char>(*tLine.pszStart)) ) ) ++tLine.pszStart;
> 
>             tLine.lLen = /*pszEnd*/pszWord - tLine.pszStart + 1;
>             vecLines.push_back( tLine );
>             tLine.pszStart = pszWord + 1;
> 
>             dCurWidth = pszEnd-pszWord > 0 ?
>                 m_pFont->GetFontMetrics()->StringWidth( pszWord+1,
>  pszEnd-pszWord-1 ) : 0.0; }
>         ++pszEnd;
>     }
> 
>     if( pszEnd-tLine.pszStart > 0 )
>     {
>         tLine.lLen = pszEnd - tLine.pszStart;
>         vecLines.push_back( tLine );
>     }
> 
>     // Do vertical alignment
>     switch( eVertical )
>     {
>         default:
>         case ePdfVerticalAlignment_Top:
>             dY += dHeight; break;
>         case ePdfVerticalAlignment_Bottom:
>             dY += m_pFont->GetFontMetrics()->GetLineSpacing() *
>  vecLines.size(); break; case ePdfVerticalAlignment_Center:
>             dY += (dHeight -
>                    ((dHeight - (m_pFont->GetFontMetrics()->GetLineSpacing()
>  * vecLines.size()))/2.0)); break;
>     }
> 
>     std::vector<TLineElement>::const_iterator it = vecLines.begin();
>     while( it != vecLines.end() )
>     {
>         dY -= m_pFont->GetFontMetrics()->GetLineSpacing();
>         if( (*it).pszStart )
>             this->DrawTextAligned( dX, dY, dWidth, PdfString(
>  (*it).pszStart, (*it).lLen ), eAlignment );
> 
>         ++it;
>     }
>     this->Restore();
> }
> 
> 
> 
> 
> 
> ---------------------------------------------------------------------------
> --- Start uncovering the many advantages of virtual appliances
> and start using them to simplify application deployment and
> accelerate your shift to cloud computing.
> http://p.sf.net/sfu/novell-sfdev2dev
> _______________________________________________
> Podofo-users mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/podofo-users
> 


-- 
**********************************************************************
Dominik Seichter - [email protected]
KRename  - http://www.krename.net  - Powerful batch renamer for KDE
KBarcode - http://www.kbarcode.net - Barcode and label printing
PoDoFo - http://podofo.sf.net - PDF generation and parsing library
SchafKopf - http://schafkopf.berlios.de - Schafkopf, a card game,  for KDE
Alan - http://alan.sf.net - A Turing Machine in Java
**********************************************************************

Attachment: signature.asc
Description: This is a digitally signed message part.

------------------------------------------------------------------------------
Start uncovering the many advantages of virtual appliances
and start using them to simplify application deployment and
accelerate your shift to cloud computing.
http://p.sf.net/sfu/novell-sfdev2dev
_______________________________________________
Podofo-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/podofo-users

Reply via email to