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 sl@0: #include "pdrtext.h" sl@0: sl@0: const TInt KPageBufferSegmentSize=2048; sl@0: sl@0: EXPORT_C CPageBuffer* CPageBuffer::NewL(CPrinterPort* aPrinterPort) sl@0: { sl@0: return NewL(aPrinterPort,KPageBufferSegmentSize); sl@0: } sl@0: sl@0: EXPORT_C CPageBuffer* CPageBuffer::NewL(CPrinterPort* aPrinterPort,TInt aGranularity) sl@0: { sl@0: CPageBuffer* pagebuffer=new(ELeave) CPageBuffer(aPrinterPort,aGranularity); sl@0: CleanupStack::PushL(pagebuffer); sl@0: pagebuffer->ConstructL(); sl@0: CleanupStack::Pop(); sl@0: return pagebuffer; sl@0: } sl@0: sl@0: EXPORT_C void CPageBuffer::StartFlush(TRequestStatus& aRequestStatus) sl@0: { // sl@0: iRequestStatus=&aRequestStatus; sl@0: aRequestStatus=KRequestPending; sl@0: iWritePos=0; sl@0: Queue(); sl@0: } sl@0: sl@0: EXPORT_C void CPageBuffer::AddBytesL(const TDesC8& aDes) sl@0: { sl@0: iBuffer->InsertL(iBuffer->Size(),aDes); sl@0: } sl@0: sl@0: EXPORT_C RWriteStream& CPageBuffer::CreateWriteStreamL() sl@0: { sl@0: if (!iWriteStreamBuffer) sl@0: { sl@0: iWriteStreamBuffer=CBufSeg::NewL(iGranularity); sl@0: iWriteStream.Open(*iWriteStreamBuffer,0); sl@0: } sl@0: else sl@0: { sl@0: iWriteStream.Truncate(*iWriteStreamBuffer,0); sl@0: } sl@0: return iWriteStream; sl@0: } sl@0: sl@0: EXPORT_C void CPageBuffer::CloseWriteStream() sl@0: { sl@0: iWriteStream.Close(); sl@0: CBufSeg* buf=iBuffer; sl@0: iBuffer=iWriteStreamBuffer; sl@0: iWriteStreamBuffer=buf; sl@0: } sl@0: sl@0: EXPORT_C CPageBuffer::~CPageBuffer() sl@0: { sl@0: Cancel(); sl@0: delete iBuffer; sl@0: if (iWriteStreamBuffer) sl@0: { sl@0: iWriteStream.Close(); sl@0: delete iWriteStreamBuffer; sl@0: } sl@0: } sl@0: sl@0: void CPageBuffer::DoCancel() sl@0: { sl@0: iPrinterPort->Cancel(); // clears my request sl@0: if (iRequestStatus!=NULL) sl@0: User::RequestComplete(iRequestStatus,KErrCancel); // clears my callers request sl@0: } sl@0: sl@0: void CPageBuffer::RunL() // Shouldn't leave in practice sl@0: { sl@0: if ((iWritePos>=iBuffer->Size()) || (iStatus!=KErrNone)) sl@0: { sl@0: iBuffer->Reset(); sl@0: if (iRequestStatus!=NULL) sl@0: User::RequestComplete(iRequestStatus,iStatus.Int()); // clears my callers request sl@0: } // Reports back error if iStatus!=KErrNone sl@0: else sl@0: { sl@0: Queue(); sl@0: } sl@0: } sl@0: sl@0: void CPageBuffer::ConstructL() sl@0: { sl@0: iBuffer=CBufSeg::NewL(iGranularity); sl@0: CActiveScheduler::Add(this); sl@0: } sl@0: sl@0: CPageBuffer::CPageBuffer(CPrinterPort* aPrinterPort,TInt aGranularity): sl@0: CActive(CActive::EPriorityLow), sl@0: iRequestStatus(NULL), sl@0: iWritePos(0), sl@0: iGranularity(aGranularity), sl@0: iBuffer(NULL), sl@0: iPtr(NULL,0), sl@0: iPrinterPort(aPrinterPort), sl@0: iWriteStream(), sl@0: iWriteStreamBuffer(NULL) sl@0: { sl@0: __DECLARE_NAME(_S("CPageBuffer")); sl@0: } sl@0: sl@0: void CPageBuffer::Queue() sl@0: { sl@0: TPtr8 ptr=iBuffer->Ptr(iWritePos); sl@0: iPtr.Set(ptr); sl@0: iPrinterPort->WriteRequest(iPtr,iStatus); sl@0: iWritePos+=iPtr.Length(); sl@0: SetActive(); sl@0: } sl@0: sl@0: /** sl@0: This function is internal only, and is not intended for use. sl@0: @internalTechnology sl@0: */ sl@0: EXPORT_C TTextFormat::TTextFormat(): sl@0: iUnderlineStyle(EUnderlineOff), sl@0: iStrikethroughStyle(EStrikethroughOff), sl@0: iColor(KRgbBlack), sl@0: iFontString(_L8("")), sl@0: iFontStyle() sl@0: { sl@0: } sl@0: sl@0: EXPORT_C TTextFormat::TTextFormat(const TFontUnderline anUnderlineStyle,const TFontStrikethrough aStrikethroughStyle,const TRgb& aColor,const TDesC8& aFontString,const TFontStyle& aFontStyle): sl@0: iUnderlineStyle(anUnderlineStyle), sl@0: iStrikethroughStyle(aStrikethroughStyle), sl@0: iColor(aColor), sl@0: iFontString(aFontString), sl@0: iFontStyle(aFontStyle) sl@0: { sl@0: } sl@0: sl@0: EXPORT_C TBool TTextFormat::operator == (const TTextFormat& aFormat) const sl@0: { sl@0: return (iUnderlineStyle==aFormat.iUnderlineStyle) && sl@0: (iStrikethroughStyle==aFormat.iStrikethroughStyle) && sl@0: (!iFontString.Compare(aFormat.iFontString)) && sl@0: (iFontStyle==aFormat.iFontStyle) && (iColor==aFormat.iColor); sl@0: } sl@0: sl@0: EXPORT_C CPageTextEntry::CPageTextEntry(const TPoint& aDrawPos,TInt aHeightInPixels,TInt aTextWidthInPixels,HBufC8* aText,TTextFormat* aTextFormat): sl@0: iDrawPos(aDrawPos), sl@0: iHeightInPixels(aHeightInPixels), sl@0: iTextWidthInPixels(aTextWidthInPixels), sl@0: iText(aText), sl@0: iTextFormat(aTextFormat) sl@0: { sl@0: __DECLARE_NAME(_S("CPageTextEntry")); sl@0: } sl@0: sl@0: EXPORT_C CPageTextEntry::~CPageTextEntry() sl@0: { sl@0: delete iText; sl@0: } sl@0: sl@0: EXPORT_C TPoint CPageTextEntry::TopTextPos() sl@0: { sl@0: return iDrawPos-TPoint(0,iHeightInPixels); sl@0: } sl@0: sl@0: CPageText::CPageText() sl@0: { sl@0: } sl@0: sl@0: void CPageText::ConstructL() sl@0: { sl@0: iTextFormatList = new(ELeave) CArrayPtrFlat(8); sl@0: iPageTextEntryList = new(ELeave) CArrayPtrFlat(8); sl@0: } sl@0: sl@0: EXPORT_C CPageText* CPageText::NewL() sl@0: { sl@0: CPageText* pagetext = new(ELeave) CPageText; sl@0: CleanupStack::PushL(pagetext); sl@0: pagetext->ConstructL(); sl@0: CleanupStack::Pop(); sl@0: return pagetext; sl@0: } sl@0: sl@0: EXPORT_C CPageText::~CPageText() sl@0: { sl@0: Reset(); sl@0: delete iPageTextEntryList; sl@0: delete iTextFormatList; sl@0: } sl@0: sl@0: EXPORT_C void CPageText::Reset() sl@0: { sl@0: if (iPageTextEntryList) sl@0: iPageTextEntryList->ResetAndDestroy(); sl@0: if (iTextFormatList) sl@0: iTextFormatList->ResetAndDestroy(); sl@0: } sl@0: sl@0: EXPORT_C void CPageText::AddEntryL(const TPoint& aPoint,const TFontUnderline aUnderlineStyle,const TFontStrikethrough aStrikethroughStyle,const TRgb& aColor,const CInfoFont* aFont,const TDesC& aString) sl@0: { sl@0: TTextFormat textformat(aUnderlineStyle,aStrikethroughStyle,aColor,aFont->CommandString(),aFont->FontSpecInTwips().iFontStyle); sl@0: TInt count=iTextFormatList->Count(); sl@0: TTextFormat* tf; sl@0: TInt i; sl@0: for (i = 0; ; i++) sl@0: { sl@0: if (i==count) sl@0: { sl@0: tf=new(ELeave) TTextFormat(textformat); sl@0: CleanupStack::PushL(tf); sl@0: iTextFormatList->AppendL(tf); sl@0: CleanupStack::Pop(); sl@0: break; sl@0: } sl@0: tf=(*iTextFormatList)[i]; sl@0: if (textformat==*tf) sl@0: break; sl@0: } sl@0: HBufC8* text=aFont->TranslateStringL(aString); sl@0: CleanupStack::PushL(text); sl@0: CPageTextEntry* textentry=new(ELeave) CPageTextEntry(aPoint+TPoint(0,aFont->BaselineOffsetInPixels()),aFont->HeightInPixels(),aFont->MeasureText(aString),text,tf); sl@0: CleanupStack::Pop(); sl@0: sl@0: i=0,count=iPageTextEntryList->Count(); sl@0: for (; (iiDrawPos.iY>(*iPageTextEntryList)[i]->iDrawPos.iY); i++ ) sl@0: { sl@0: } sl@0: for (; (iiDrawPos.iY==(*iPageTextEntryList)[i]->iDrawPos.iY) && sl@0: (textentry->iDrawPos.iX>(*iPageTextEntryList)[i]->iDrawPos.iX); i++) sl@0: { sl@0: } sl@0: CleanupStack::PushL(textentry); sl@0: iPageTextEntryList->InsertL(i,textentry); sl@0: CleanupStack::Pop(); sl@0: if (textentry->iHeightInPixels>iMaxFontHeightInPixels) sl@0: iMaxFontHeightInPixels=textentry->iHeightInPixels; sl@0: } sl@0: sl@0: EXPORT_C TInt CPageText::NumEntries() sl@0: { sl@0: return iPageTextEntryList->Count(); sl@0: } sl@0: sl@0: EXPORT_C CPageTextEntry* CPageText::operator [] (TInt anIndex) sl@0: { sl@0: return (*iPageTextEntryList)[anIndex]; sl@0: }