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: sl@0: #include "EPSNSTD.H" sl@0: sl@0: #include sl@0: #include sl@0: #include "EPSON.H" sl@0: #include "pdrtext.h" sl@0: sl@0: sl@0: sl@0: EXPORT_C CPrinterDevice* NewPrinterDeviceL() sl@0: { sl@0: CEpsonDevice* device = new(ELeave) CEpsonDevice; sl@0: return device; sl@0: } sl@0: sl@0: CEpsonDevice::CEpsonDevice(): sl@0: CFbsDrvDevice() sl@0: { sl@0: __DECLARE_NAME(_S("CEpsonDevice")); sl@0: } sl@0: sl@0: CEpsonDevice::~CEpsonDevice() sl@0: { sl@0: } sl@0: sl@0: void CEpsonDevice::CreateControlL(CPrinterPort* aPrinterPort) sl@0: { sl@0: __ASSERT_ALWAYS(aPrinterPort, Panic(EEpsonRequiresPrinterPort)); sl@0: __ASSERT_ALWAYS(!iControl, Panic(EEpsonControlAlreadyExists)); sl@0: __ASSERT_DEBUG(iCurrentPageSpecInTwips.iPortraitPageSize.iWidth && iCurrentPageSpecInTwips.iPortraitPageSize.iHeight, Panic(EEpsonPageSpecNotSet)); sl@0: iControl = CEpsonControl::NewL(this, aPrinterPort, *iStore, iModelInfo->iResourcesStreamId); sl@0: } sl@0: sl@0: CEpsonControl* CEpsonControl::NewL(CPdrDevice* aPdrDevice, CPrinterPort* aPrinterPort, CStreamStore& aStore, TStreamId aResourcesStreamId) sl@0: { sl@0: CEpsonControl* control=new(ELeave) CEpsonControl(aPdrDevice, aPrinterPort); sl@0: CleanupStack::PushL(control); sl@0: control->ConstructL(aStore, aResourcesStreamId); sl@0: CleanupStack::Pop(); sl@0: return control; sl@0: } sl@0: sl@0: CEpsonControl::~CEpsonControl() sl@0: { sl@0: } sl@0: sl@0: void CEpsonControl::ConstructL(CStreamStore& aStore, TStreamId aResourcesStreamId) sl@0: { sl@0: if((iPdrDevice->CurrentPageSpecInTwips().iOrientation == TPageSpec::ELandscape) sl@0: && (iPdrDevice->Flags() & EEpsonLandscapeNotAvailable)) sl@0: User::Leave(KErrNotSupported); sl@0: CFbsDrvControl::ConstructL(aStore, aResourcesStreamId); sl@0: TRect rect = iPdrDevice->PrintablePageInPixels(); sl@0: TSize size; sl@0: size.iWidth = iPdrDevice->HorizontalPixelsToTwips(1000); sl@0: size.iHeight = iPdrDevice->VerticalPixelsToTwips(1000); sl@0: iBandedDevice = CBandedDevice::NewL(rect, size, iPdrDevice->DisplayMode(), EBandingTopToBottom, KEpsonNumScanLinesPerBand); sl@0: iPageText = CPageText::NewL(); sl@0: } sl@0: sl@0: void CEpsonControl::OutputBandL() sl@0: { sl@0: if(IsGraphicsBand()) sl@0: { sl@0: TRect bandrect = iBandedDevice->BandRect(); sl@0: TSize size = bandrect.Size(); sl@0: TCommandString des; sl@0: TBool datainband = EFalse; sl@0: for(TInt i = 0; i < size.iWidth; i++) sl@0: { sl@0: iBandedDevice->BandBitmap()->GetVerticalScanLine(iScanLine, i, iPdrDevice->DisplayMode()); sl@0: if(TransformBuffer() && !datainband) sl@0: { sl@0: MoveToL(bandrect.iTl + TPoint(i, 0)); sl@0: des.Format(iResources->ResourceString(EPdrBitmapStart), size.iWidth - i); sl@0: iPageBuffer->AddBytesL(des); sl@0: datainband = ETrue; sl@0: } sl@0: if(datainband) sl@0: iPageBuffer->AddBytesL(iScanLine); sl@0: } sl@0: if(datainband) sl@0: { sl@0: iPageBuffer->AddBytesL(iResources->ResourceString(EPdrBitmapEnd)); sl@0: iPosition.iX = iPdrDevice->OffsetInPixels().iX; sl@0: } sl@0: sl@0: TInt numentries = iPageText->NumEntries(); sl@0: if(numentries) sl@0: { sl@0: CPageTextEntry* entry; sl@0: for(TInt y = bandrect.iTl.iY; y <= bandrect.iBr.iY; y++) sl@0: { sl@0: for(TInt index = 0; (index < numentries); index++) sl@0: { sl@0: entry = (*iPageText)[index]; sl@0: TPoint drawPos = entry->iDrawPos - TPoint(0, 20); // bodge to align pdr fonts with true types sl@0: if(drawPos.iY == y) sl@0: OutputTextL(drawPos, entry->iTextWidthInPixels, *(entry->iTextFormat), *(entry->iText)); //!! sl@0: } sl@0: } sl@0: } sl@0: } sl@0: } sl@0: sl@0: void CEpsonControl::MoveToL(const TPoint& aPoint) sl@0: { sl@0: TPoint vector = aPoint - iPosition; sl@0: for(; vector.iY > 255; ) sl@0: { sl@0: MoveByL(TPoint(0, 255)); sl@0: vector = aPoint - iPosition; sl@0: } sl@0: MoveByL(vector); sl@0: } sl@0: sl@0: TBool CEpsonControl::TransformBuffer() sl@0: { sl@0: TUint8* pStart = (TUint8*)iScanLine.Ptr(); sl@0: TUint8* pEnd = pStart + (KEpsonNumScanLinesPerBand >> 3); sl@0: TUint8* p; sl@0: for(p = pStart; (p < pEnd) && (*p == 0xFF); p++) sl@0: { sl@0: } sl@0: TBool datainscanline = (p < pEnd); sl@0: for(p = pStart; p> 1; sl@0: } sl@0: *p = (TUint8)~byte2; sl@0: } sl@0: return datainscanline; // returns ETrue if there are non-blank bytes in scanline sl@0: } sl@0: sl@0: CEpsonControl::CEpsonControl(CPdrDevice* aPdrDevice, CPrinterPort* aPrinterPort): sl@0: CFbsDrvControl(aPdrDevice, aPrinterPort), sl@0: iScanLine() sl@0: { sl@0: __DECLARE_NAME(_S("CEpsonControl")); sl@0: } sl@0: