textrendering/texthandling/sconpics/CONPICS.CPP
changeset 0 1fb32624e06b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/textrendering/texthandling/sconpics/CONPICS.CPP	Tue Feb 02 02:02:46 2010 +0200
@@ -0,0 +1,308 @@
+/*
+* 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 <e32std.h>
+#include <e32base.h>
+
+#include <gdi.h>
+#include <s32mem.h>
+#include <conpics.h>
+
+#include "TESTPANI.H"
+
+// ***************************************************************************
+// MDEMPICTUREHEADERFACTORY IMPLEMENTATION
+// ***************************************************************************
+
+EXPORT_C MDemPictureFactory::MDemPictureFactory()
+// Fix to force GCC to export the vtable.
+//
+	{}
+
+
+EXPORT_C void MDemPictureFactory::NewPictureL(TPictureHeader& aHeader,const CStreamStore& aDeferredPictureStore)const
+// From the picture header, instantiates the correct concrete picture, and
+// restores it frorm the specified stream.
+//
+	{
+	if (aHeader.iPictureType==KUidXzePictureType)	
+		aHeader.iPicture=CXzePicture::NewL(aDeferredPictureStore,aHeader.iPicture.AsId());
+	else if(aHeader.iPictureType==KUidXzeDoorType)
+		aHeader.iPicture=CXzeDoor::NewL(aDeferredPictureStore,aHeader.iPicture.AsId());
+	else
+		Panic(EPictureTypeNotSupportedByHeader);
+	}
+
+
+
+
+// ***************************************************************************
+// TEST PICTURE IMPLEMENTATION
+// ***************************************************************************
+EXPORT_C CXzePicture* CXzePicture::NewL(TChar aLabel)
+	{return new(ELeave) CXzePicture(aLabel);}
+
+
+EXPORT_C CXzePicture* CXzePicture::NewL(const CStreamStore& aStore,TStreamId aId)
+// Restoring NewL.
+//
+	{
+	CXzePicture* self=new(ELeave) CXzePicture();
+	CleanupStack::PushL(self);
+	self->RestoreL(aStore,aId);
+	CleanupStack::Pop();
+	return self;
+	}
+
+
+EXPORT_C CXzePicture::CXzePicture(TChar aLabel)
+// Sets the startup attributes of this picture
+//
+	: iLabel(aLabel)
+	{ResetToOriginal();}
+
+
+EXPORT_C CXzePicture::CXzePicture()
+// Sets the startup attributes of this picture
+//
+//	
+	{ResetToOriginal();}
+
+
+EXPORT_C CXzePicture::~CXzePicture()
+	{}
+
+
+EXPORT_C void CXzePicture::ExternalizeL(RWriteStream& aStream)const
+// Save this picture.
+// Typically called from the base class StoreL();
+//
+	{aStream.WriteUint32L(iLabel);}
+
+
+EXPORT_C void CXzePicture::InternalizeL(RReadStream& aStream)
+// Load this picture
+//
+	{iLabel=(TChar)aStream.ReadUint32L();}
+
+
+EXPORT_C void CXzePicture::RestoreL(const CStreamStore& aStore,TStreamId aStreamId)
+// Create a read-stream over aStore, and open it over the specified stream ID.
+// Internalize picture from this stream.
+//
+	{
+	RStoreReadStream stream;
+	stream.OpenLC(aStore,aStreamId);
+	stream>> *this;
+	CleanupStack::PopAndDestroy();
+	}
+
+
+EXPORT_C void CXzePicture::Draw(CGraphicsContext& aGc,const TPoint& aTopLeft,const TRect& aClipRect,MGraphicsDeviceMap* aMap) const
+// Draw this simple picture.
+//
+ 	{
+	aGc.Reset();
+	aGc.SetClippingRect(aClipRect);
+	TSize size;  // Size of graphics device in pixels
+	GetSizeInPixels(aMap,size);
+	TRect box;  // The rectangle that exactly fits the picture
+	box.iTl=aTopLeft;
+	box.iBr.iX=aTopLeft.iX+size.iWidth;
+	box.iBr.iY=aTopLeft.iY+size.iHeight;
+	TRgb white(255,255,255);
+// First draw outer box and fill in rest of box.
+	aGc.SetBrushColor(white);
+	aGc.SetBrushStyle(CGraphicsContext::ESolidBrush);
+	aGc.DrawRect(box);
+// Now draw label
+	CFont* font;
+	TFontSpec fontSpec(_L("Arial"),213);
+	if (aMap->GetNearestFontInTwips(font,fontSpec)<0)
+		{
+		return;
+		}
+	aGc.UseFont(font);
+	TBuf<1> label;	label.Append(iLabel);
+	TInt baselineOffset=(box.Height()+font->AscentInPixels())/2; 
+	aGc.SetBrushStyle(CGraphicsContext::ENullBrush);
+	aGc.DrawText(label,box,baselineOffset,CGraphicsContext::ECenter);
+	aGc.DiscardFont();
+	aMap->ReleaseFont(font);
+	}
+
+
+EXPORT_C void CXzePicture::GetOriginalSizeInTwips(TSize& aSize)const
+//
+	{aSize=iOriginalSizeInTwips;}
+
+
+EXPORT_C CXzeDoor* CXzeDoor::NewL(TChar aLabel,TBool aAlwaysFailToDetach)
+	{return new(ELeave) CXzeDoor(aLabel,aAlwaysFailToDetach);}
+
+
+EXPORT_C CXzeDoor* CXzeDoor::NewL(const CStreamStore& aStore,TStreamId aId)
+// Restoring NewL.
+//
+	{
+	CXzeDoor* self=new(ELeave) CXzeDoor(EFalse);
+	CleanupStack::PushL(self);
+	self->RestoreL(aStore,aId);
+	CleanupStack::Pop();
+	return self;
+	}
+
+
+EXPORT_C CXzeDoor::CXzeDoor(TChar aLabel,TBool aAlwaysFailToDetach)
+// Sets the startup attributes of this picture
+//
+	: CXzePicture(aLabel), iAlwaysFailToDetach(aAlwaysFailToDetach)
+	{ResetToOriginal();}
+
+
+EXPORT_C CXzeDoor::CXzeDoor(TBool aAlwaysFailToDetach)
+// Sets the startup attributes of this picture
+//
+//	
+	: iAlwaysFailToDetach(aAlwaysFailToDetach)
+	{ResetToOriginal();}
+
+
+EXPORT_C void CXzeDoor::DetachFromStoreL(TDetach /*aDegree*/)
+//
+//
+	{
+	if (iAlwaysFailToDetach)
+		User::Leave(KErrNotSupported);
+	}
+
+EXPORT_C void CXzeDoor::ExternalizeL(RWriteStream& aStream)const
+// Save this picture.
+// Typically called from the base class StoreL();
+//
+	{
+	CXzePicture::ExternalizeL(aStream);
+	aStream.WriteUint8L((TUint8)iAlwaysFailToDetach!=EFalse);
+	}
+
+
+EXPORT_C void CXzeDoor::InternalizeL(RReadStream& aStream)
+// Load this picture
+//
+	{
+	CXzePicture::InternalizeL(aStream);
+	iAlwaysFailToDetach=TBool(aStream.ReadUint8L());
+	}
+
+
+EXPORT_C void CXzeDoor::RestoreL(const CStreamStore& aStore,TStreamId aStreamId)
+// Create a read-stream over aStore, and open it over the specified stream ID.
+// Internalize picture from this stream.
+//
+	{
+	RStoreReadStream stream;
+	stream.OpenLC(aStore,aStreamId);
+	stream>> *this;
+	CleanupStack::PopAndDestroy();
+	}
+
+
+EXPORT_C CTestPicture* CTestPicture::NewL()
+	{return new(ELeave) CTestPicture();}
+
+
+EXPORT_C CTestPicture::CTestPicture()
+	{ResetToOriginal();}
+
+
+EXPORT_C void CTestPicture::GetOriginalSizeInTwips(TSize& aSize)const
+//
+	{aSize=iOriginalSizeInTwips;}
+
+
+EXPORT_C void CTestPicture::Draw(CGraphicsContext& aGc,const TPoint& aTopLeft,const TRect& aClipRect,MGraphicsDeviceMap* /*aMap*/) const
+// draw a simple object
+ {
+	aGc.Reset();
+	aGc.SetClippingRect(aClipRect);
+	TSize size; // Size in pixels
+	TSize sizeInner; // In pixels
+	TRect box;
+	GetSizeInPixels(aGc.Device(),size);
+	box.iTl=aTopLeft;
+	box.iBr.iX=aTopLeft.iX+size.iWidth;
+	box.iBr.iY=aTopLeft.iY+size.iHeight;
+	TRgb black(0,0,0);
+	TRgb white(255,255,255);
+// First draw outer box and fill in rest of box.
+	aGc.SetBrushColor(white);
+	aGc.SetBrushStyle(CGraphicsContext::ESolidBrush);
+	aGc.DrawRect(box);
+// Inner box.
+	sizeInner.iWidth=size.iWidth/3;
+	sizeInner.iHeight=size.iHeight/3;
+	box.iTl.iX+=sizeInner.iWidth;
+	box.iTl.iY+=sizeInner.iHeight;
+	box.iBr.iX-=sizeInner.iWidth;
+	box.iBr.iY-=+sizeInner.iHeight;
+	aGc.SetBrushColor(black);
+	aGc.SetBrushStyle(CGraphicsContext::EDiamondCrossHatchBrush);
+	aGc.DrawRect(box);
+	}
+
+
+EXPORT_C void CTestPicture::ExternalizeL(RWriteStream& /*aStream*/)const
+	{}
+
+
+////////////////////////////////////////////////////////////////////////
+
+EXPORT_C CDummyField::CDummyField()
+	{
+	}
+
+
+EXPORT_C TInt CDummyField::Value(TPtr& aValueText)
+	{
+	if (aValueText.MaxLength() < 3)
+		return 3;
+	else 
+		{
+		aValueText = _L("XXX");
+		return 0;
+		}
+	}
+
+
+EXPORT_C void CDummyField::ExternalizeL(RWriteStream& aStream)const
+	{
+	aStream.WriteUint8L(0);  // empty streams cause problems
+	}
+
+
+EXPORT_C void CDummyField::InternalizeL(RReadStream& aStream)
+	{
+	TUint8 dummy=aStream.ReadUint8L();
+	dummy=0;
+	}
+
+
+EXPORT_C TUid CDummyField::Type() const
+	{
+	return KNullUid;
+	}