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