os/graphics/printingservices/printerdriversupport/src/PDRPAGE.CPP
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 // Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
     2 // All rights reserved.
     3 // This component and the accompanying materials are made available
     4 // under the terms of "Eclipse Public License v1.0"
     5 // which accompanies this distribution, and is available
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
     7 //
     8 // Initial Contributors:
     9 // Nokia Corporation - initial contribution.
    10 //
    11 // Contributors:
    12 //
    13 // Description:
    14 //
    15 
    16 #include <pdrstore.h>
    17 #include "pdrtext.h"
    18 
    19 const TInt KPageBufferSegmentSize=2048;
    20 
    21 EXPORT_C CPageBuffer* CPageBuffer::NewL(CPrinterPort* aPrinterPort)
    22 	{
    23 	return NewL(aPrinterPort,KPageBufferSegmentSize);
    24 	}
    25 
    26 EXPORT_C CPageBuffer* CPageBuffer::NewL(CPrinterPort* aPrinterPort,TInt aGranularity)
    27 	{
    28 	CPageBuffer* pagebuffer=new(ELeave) CPageBuffer(aPrinterPort,aGranularity);
    29 	CleanupStack::PushL(pagebuffer);
    30 	pagebuffer->ConstructL();
    31 	CleanupStack::Pop();
    32 	return pagebuffer;
    33 	}
    34 
    35 EXPORT_C void CPageBuffer::StartFlush(TRequestStatus& aRequestStatus)	
    36 	{		//  
    37 	iRequestStatus=&aRequestStatus;
    38 	aRequestStatus=KRequestPending;
    39 	iWritePos=0;
    40 	Queue();
    41 	}
    42 
    43 EXPORT_C void CPageBuffer::AddBytesL(const TDesC8& aDes)
    44 	{
    45 	iBuffer->InsertL(iBuffer->Size(),aDes);
    46 	}
    47 
    48 EXPORT_C RWriteStream& CPageBuffer::CreateWriteStreamL()
    49 	{
    50 	if (!iWriteStreamBuffer)
    51 		{
    52 		iWriteStreamBuffer=CBufSeg::NewL(iGranularity);
    53 		iWriteStream.Open(*iWriteStreamBuffer,0);
    54 		}
    55 	else
    56 		{
    57 		iWriteStream.Truncate(*iWriteStreamBuffer,0);
    58 		}
    59 	return iWriteStream;
    60 	}
    61 
    62 EXPORT_C void CPageBuffer::CloseWriteStream()
    63 	{
    64 	iWriteStream.Close();
    65 	CBufSeg* buf=iBuffer;
    66 	iBuffer=iWriteStreamBuffer;
    67 	iWriteStreamBuffer=buf;
    68 	}
    69 
    70 EXPORT_C CPageBuffer::~CPageBuffer()
    71 	{
    72 	Cancel();
    73 	delete iBuffer;
    74 	if (iWriteStreamBuffer)
    75 		{
    76 		iWriteStream.Close();
    77 		delete iWriteStreamBuffer;
    78 		}
    79 	}
    80 
    81 void CPageBuffer::DoCancel()
    82 	{
    83 	iPrinterPort->Cancel();	// clears my request
    84 	if (iRequestStatus!=NULL)
    85 		User::RequestComplete(iRequestStatus,KErrCancel); // clears my callers request
    86 	}
    87 
    88 void CPageBuffer::RunL()  //  Shouldn't leave in practice
    89 	{	
    90 	if ((iWritePos>=iBuffer->Size()) || (iStatus!=KErrNone))
    91 		{
    92 		iBuffer->Reset();
    93 		if (iRequestStatus!=NULL)
    94 			User::RequestComplete(iRequestStatus,iStatus.Int()); // clears my callers request
    95 		}	   //  Reports back error if iStatus!=KErrNone
    96 	else
    97 		{
    98 		Queue();
    99 		}
   100 	}
   101 
   102 void CPageBuffer::ConstructL()
   103 	{
   104 	iBuffer=CBufSeg::NewL(iGranularity);
   105 	CActiveScheduler::Add(this);
   106 	}
   107 
   108 CPageBuffer::CPageBuffer(CPrinterPort* aPrinterPort,TInt aGranularity):
   109 	CActive(CActive::EPriorityLow),
   110 	iRequestStatus(NULL),
   111 	iWritePos(0),
   112 	iGranularity(aGranularity),
   113 	iBuffer(NULL),
   114 	iPtr(NULL,0),
   115 	iPrinterPort(aPrinterPort),
   116 	iWriteStream(),
   117 	iWriteStreamBuffer(NULL)
   118 	{
   119 	__DECLARE_NAME(_S("CPageBuffer"));
   120 	}
   121 
   122 void CPageBuffer::Queue()
   123 	{
   124 	TPtr8 ptr=iBuffer->Ptr(iWritePos);
   125 	iPtr.Set(ptr);
   126 	iPrinterPort->WriteRequest(iPtr,iStatus);
   127 	iWritePos+=iPtr.Length();
   128 	SetActive();
   129 	}
   130 
   131 /** 
   132   This function is internal only, and is not intended for use. 
   133   @internalTechnology
   134 */
   135 EXPORT_C TTextFormat::TTextFormat():
   136 	iUnderlineStyle(EUnderlineOff),
   137 	iStrikethroughStyle(EStrikethroughOff),
   138 	iColor(KRgbBlack),
   139 	iFontString(_L8("")),
   140 	iFontStyle()
   141 	{
   142 	}
   143 
   144 EXPORT_C TTextFormat::TTextFormat(const TFontUnderline anUnderlineStyle,const TFontStrikethrough aStrikethroughStyle,const TRgb& aColor,const TDesC8& aFontString,const TFontStyle& aFontStyle):
   145 	iUnderlineStyle(anUnderlineStyle),
   146 	iStrikethroughStyle(aStrikethroughStyle),
   147 	iColor(aColor),
   148 	iFontString(aFontString),
   149 	iFontStyle(aFontStyle)
   150 	{
   151 	}
   152 
   153 EXPORT_C TBool TTextFormat::operator == (const TTextFormat& aFormat) const
   154 	{
   155 	return (iUnderlineStyle==aFormat.iUnderlineStyle) &&
   156 	       (iStrikethroughStyle==aFormat.iStrikethroughStyle) &&
   157 	       (!iFontString.Compare(aFormat.iFontString)) && 
   158 	       (iFontStyle==aFormat.iFontStyle) && (iColor==aFormat.iColor);
   159 	}
   160 
   161 EXPORT_C CPageTextEntry::CPageTextEntry(const TPoint& aDrawPos,TInt aHeightInPixels,TInt aTextWidthInPixels,HBufC8* aText,TTextFormat* aTextFormat):
   162 	iDrawPos(aDrawPos),
   163 	iHeightInPixels(aHeightInPixels),
   164 	iTextWidthInPixels(aTextWidthInPixels),
   165 	iText(aText),
   166 	iTextFormat(aTextFormat)
   167 	{
   168 	__DECLARE_NAME(_S("CPageTextEntry"));
   169 	}
   170 
   171 EXPORT_C CPageTextEntry::~CPageTextEntry()
   172 	{
   173 	delete iText;
   174 	}
   175 
   176 EXPORT_C TPoint CPageTextEntry::TopTextPos()
   177 	{
   178 	return iDrawPos-TPoint(0,iHeightInPixels);
   179 	}
   180 
   181 CPageText::CPageText()
   182 	{
   183 	}
   184 
   185 void CPageText::ConstructL()
   186 	{
   187 	iTextFormatList = new(ELeave) CArrayPtrFlat<TTextFormat>(8);
   188 	iPageTextEntryList = new(ELeave) CArrayPtrFlat<CPageTextEntry>(8);
   189 	}
   190 
   191 EXPORT_C CPageText* CPageText::NewL()
   192 	{
   193 	CPageText* pagetext = new(ELeave) CPageText;
   194 	CleanupStack::PushL(pagetext);
   195 	pagetext->ConstructL();
   196 	CleanupStack::Pop();
   197 	return pagetext;
   198 	}
   199 
   200 EXPORT_C CPageText::~CPageText()
   201 	{
   202 	Reset();
   203 	delete iPageTextEntryList;
   204 	delete iTextFormatList;
   205 	}
   206 
   207 EXPORT_C void CPageText::Reset()
   208 	{
   209 	if (iPageTextEntryList)
   210 		iPageTextEntryList->ResetAndDestroy();
   211 	if (iTextFormatList)
   212 		iTextFormatList->ResetAndDestroy();
   213 	}
   214 
   215 EXPORT_C void CPageText::AddEntryL(const TPoint& aPoint,const TFontUnderline aUnderlineStyle,const TFontStrikethrough aStrikethroughStyle,const TRgb& aColor,const CInfoFont* aFont,const TDesC& aString)
   216 	{
   217 	TTextFormat textformat(aUnderlineStyle,aStrikethroughStyle,aColor,aFont->CommandString(),aFont->FontSpecInTwips().iFontStyle);
   218 	TInt count=iTextFormatList->Count();
   219 	TTextFormat* tf;
   220 	TInt i;
   221 	for (i = 0; ; i++)
   222 		{
   223 		if (i==count)
   224 			{
   225 			tf=new(ELeave) TTextFormat(textformat);
   226 			CleanupStack::PushL(tf);
   227 			iTextFormatList->AppendL(tf);
   228 			CleanupStack::Pop();
   229 			break;
   230 			}
   231 		tf=(*iTextFormatList)[i];
   232 		if (textformat==*tf)
   233 			break;
   234 		}
   235 	HBufC8* text=aFont->TranslateStringL(aString);
   236 	CleanupStack::PushL(text);
   237 	CPageTextEntry* textentry=new(ELeave) CPageTextEntry(aPoint+TPoint(0,aFont->BaselineOffsetInPixels()),aFont->HeightInPixels(),aFont->MeasureText(aString),text,tf);
   238 	CleanupStack::Pop();
   239 
   240 	i=0,count=iPageTextEntryList->Count();
   241 	for (; (i<count) && (textentry->iDrawPos.iY>(*iPageTextEntryList)[i]->iDrawPos.iY); i++ )
   242 		{
   243 		}
   244 	for (; (i<count) && (textentry->iDrawPos.iY==(*iPageTextEntryList)[i]->iDrawPos.iY) &&
   245 	                    (textentry->iDrawPos.iX>(*iPageTextEntryList)[i]->iDrawPos.iX); i++)
   246 		{
   247 		}
   248 	CleanupStack::PushL(textentry);
   249 	iPageTextEntryList->InsertL(i,textentry);
   250 	CleanupStack::Pop();
   251 	if (textentry->iHeightInPixels>iMaxFontHeightInPixels)
   252 		iMaxFontHeightInPixels=textentry->iHeightInPixels;
   253 	}
   254 
   255 EXPORT_C TInt CPageText::NumEntries()
   256 	{
   257 	return iPageTextEntryList->Count();
   258 	}
   259 
   260 EXPORT_C CPageTextEntry* CPageText::operator [] (TInt anIndex)
   261 	{
   262 	return (*iPageTextEntryList)[anIndex];
   263 	}