graphicsdeviceinterface/gdi/sgdi/PICTURE.CPP
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicsdeviceinterface/gdi/sgdi/PICTURE.CPP	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,290 @@
+// Copyright (c) 1998-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 <gdi.h>
+#include "GDIPANIC.h"
+
+_LIT(KGdiCPicturePanicCategory,"CPicture");
+
+EXPORT_C TPictureHeader::TPictureHeader():
+	iPicture(NULL),
+	iPictureType(KNullUid),
+	iSize()
+/** Constructs a default picture header. */
+	{}
+
+EXPORT_C void TPictureHeader::DeletePicture()
+/** Deletes the internalised picture.
+
+The picture can only be deleted if the picture has been internalized. */
+	{
+	if (iPicture.IsPtr())
+		{
+		delete iPicture.AsPtr();
+		iPicture=NULL;
+		}
+	}
+
+
+// Persist this object
+// Does not take responsibility for storing the picture
+//
+EXPORT_C void TPictureHeader::ExternalizeL(RWriteStream& aStream)const
+/** Externalises a picture header object to a write stream. 
+
+The presence of this function means that the standard templated stream operator<<() 
+is available to externalise objects of this class.
+
+@param aStream The write stream. */
+    {
+    aStream<< iPictureType;
+    aStream<< iPicture;
+	aStream.WriteInt32L(iSize.iWidth);
+	aStream.WriteInt32L(iSize.iHeight);
+    }
+
+
+// Restore this object from the specified stream
+// Does not take responsibility for restoring the picture
+//
+EXPORT_C void TPictureHeader::InternalizeL(RReadStream& aStream)
+/** Internalises a picture header object from a read stream.
+
+The presence of this function means that the standard templated stream operator>>() 
+is available to internalise objects of this class.
+
+@param aStream The read stream. */
+    {
+    aStream>> iPictureType;
+    aStream>> iPicture;
+	iSize.iWidth=aStream.ReadInt32L();
+	iSize.iHeight=aStream.ReadInt32L();
+    }
+
+EXPORT_C CPicture::CPicture():
+	CBase()
+	{
+	__DECLARE_NAME(_S("CPicture"));
+	}
+
+EXPORT_C CPicture::~CPicture()
+/** Frees all resources owned by the object prior to its destruction. */
+	{}
+
+EXPORT_C TPictureCapability CPicture::Capability() const
+/** Gets the picture's capabilities.
+
+These include whether it is scalable and croppable.
+
+@return The capabilities of the picture. */
+	{
+	return TPictureCapability(TPictureCapability::ENotScaleable,EFalse);
+	}
+
+// Assumes everything goes into the head stream.
+// (Must be replaced by concrete pictures that have components)
+//
+EXPORT_C TStreamId CPicture::StoreL(CStreamStore& aStore) const
+/** Stores the picture to the specified store.
+
+The default implementation assumes that the content of the picture is externalized 
+to a single stream. The implementation may need to be changed for those derived 
+classes that have components.
+
+@param aStore The store. 
+@return The ID of the (head) stream used to store the picture. */
+	{
+	RStoreWriteStream stream;
+	TStreamId id=stream.CreateLC(aStore);
+	ExternalizeL(stream);  // provided by the concrete picture stream.CommitL();
+	stream.CommitL();
+	CleanupStack::PopAndDestroy();
+	return id;
+	}
+
+EXPORT_C void CPicture::ResetToOriginal()
+/** Resets the picture's scaling and cropping attributes to their original values. */
+	{
+	TMargins cropInTwips;
+	cropInTwips.iLeft=0;
+	cropInTwips.iRight=0;
+	cropInTwips.iTop=0;
+	cropInTwips.iBottom=0;
+	SetCropInTwips(cropInTwips);
+	SetScaleFactor(1000,1000);
+	}
+
+EXPORT_C void CPicture::GetSizeInPixels(MGraphicsDeviceMap* aMap,TSize& aSize) const
+/** Gets the picture's size in pixels. 
+
+This is calculated from the original size of the picture, taking cropping 
+and scaling into account.
+
+@param aMap The pixels to twips mapping interface of the graphics device 
+@param aSize The size of the picture, in pixels. */
+	{
+	GDI_ASSERT_ALWAYS_GENERAL(aMap!=NULL,User::Panic(KGdiCPicturePanicCategory,KErrNotFound));
+	TSize size;
+	GetSizeInTwips(size);
+	aSize.iWidth = aMap->HorizontalTwipsToPixels(size.iWidth);
+	aSize.iHeight = aMap->VerticalTwipsToPixels(size.iHeight);
+	}
+
+EXPORT_C void CPicture::SetSizeInPixels(MGraphicsDeviceMap* aMap,const TSize& aSize)
+/** Sets the picture's size in pixels.
+
+@param aMap The pixels to twips mapping interface of the graphics device. 
+@param aSize The size of the picture, in pixels. */
+	{
+	GDI_ASSERT_ALWAYS_GENERAL(aMap!=NULL,User::Panic(KGdiCPicturePanicCategory,KErrNotFound));
+	TSize size;
+	size.iWidth = aMap->HorizontalPixelsToTwips(aSize.iWidth);
+	size.iHeight = aMap->VerticalPixelsToTwips(aSize.iHeight);
+	SetSizeInTwips(size);
+	}
+
+EXPORT_C void CPicture::SetScaleFactor(TInt /*aScaleFactorWidth*/,TInt /*aScaleFactorHeight*/)
+/** Sets the picture's scale factors.
+	
+	@param aScaleFactorWidth The width scale factor, in percent. 
+	@param aScaleFactorHeight The height scale factor, in percent. */
+	{
+	}
+
+EXPORT_C TInt CPicture::ScaleFactorWidth() const
+/** Gets the picture's width scale factor.
+
+@return The width scale factor, in percent. */
+	{
+	return 1000; // no scaling
+	}
+
+EXPORT_C TInt CPicture::ScaleFactorHeight() const
+/** Gets the pictures height scale factor.
+
+@return The height scale factor, in percent. */
+	{
+	return 1000; // no scaling
+	}
+
+EXPORT_C void CPicture::GetCropInTwips(TMargins& aCrop) const
+/** Gets the cropping margins of a picture in twips.
+	
+These margins are relative to the original unscaled size of the picture.
+	
+@param aMargins The cropping margins of the picture, in twips */
+    {
+	aCrop.iLeft=0;
+	aCrop.iRight=0;
+	aCrop.iTop=0;
+	aCrop.iBottom=0;
+	}
+
+EXPORT_C void CPicture::SetCropInTwips(const TMargins& /*aMargins*/)
+/** Sets the cropping margins of a picture in twips.
+	
+These are relative to the original unscaled size of the picture.
+	
+@param aMargins The cropping margins of the picture, in twips. */
+	{
+	}
+
+
+EXPORT_C TBool CPicture::LineBreakPossible(TUint /*aClass*/,TBool /*aBeforePicture*/,TBool /*aHaveSpaces*/) const
+/** States whether a line break is possible, either before or after a picture.
+	
+The default implementation returns ETrue, implying that there is a break opportunity 
+both before and after the picture, whether or not a space is present.
+
+This may be overridden for special types of pictures.
+
+@param aClass The line breaking class of the adjacent character. Line breaking 
+classes are defined in the header file, tagma.h
+@param aBeforePicture ETrue, if the adjacent character is before the picture; 
+EFalse, if the adjacent character is afterwards.
+@param aHaveSpaces ETrue, if spaces occur between the adjacent character and 
+the picture; EFalse, otherwise.
+@return ETrue, if a line break is possible; EFalse, otherwise. */
+	{
+	return TRUE;
+	}
+
+
+
+EXPORT_C TBool CPicture::NativePixelSize(TSize&)
+/** Derived classes might be implemented as bitmaps, in that case it might 
+be interesting to now the native pixel size of the bitmap. */
+	{
+	return EFalse;
+	}
+
+EXPORT_C void CPicture::GetSizeInTwips(TSize& aSize) const
+/** Gets the picture's size, in twips.
+
+This size is calculated from the original size of the picture, taking cropping 
+and scaling into account.
+
+@param aSize The size of the picture, in twips. */
+	{
+	TSize originalSizeInTwips;
+	GetOriginalSizeInTwips(originalSizeInTwips);
+	TMargins cropInTwips;
+	GetCropInTwips(cropInTwips);
+	aSize.iWidth = (ScaleFactorWidth()*(originalSizeInTwips.iWidth-cropInTwips.iLeft-cropInTwips.iRight))/1000;
+	aSize.iHeight = (ScaleFactorHeight()*(originalSizeInTwips.iHeight-cropInTwips.iTop-cropInTwips.iBottom))/1000;
+	}
+
+EXPORT_C void CPicture::SetSizeInTwips(const TSize& aSize)
+/** Sets the picture's size, in twips
+
+@param aSize The size of the picture, in twips. */
+	{
+	TSize originalSizeInTwips;
+	GetOriginalSizeInTwips(originalSizeInTwips);
+	TMargins cropInTwips;
+	GetCropInTwips(cropInTwips);
+	TSize size;
+	size.iWidth  = originalSizeInTwips.iWidth-cropInTwips.iLeft-cropInTwips.iRight;
+	size.iHeight = originalSizeInTwips.iHeight-cropInTwips.iTop-cropInTwips.iBottom;
+	TSize scalefactor;
+	if(size.iWidth!=0) scalefactor.iWidth=1000*aSize.iWidth/size.iWidth;
+	if(size.iHeight!=0) scalefactor.iHeight=1000*aSize.iHeight/size.iHeight;
+	SetScaleFactor(scalefactor.iWidth,scalefactor.iHeight);
+ 	}
+
+EXPORT_C void CPicture::AddCropInPixels(MGraphicsDeviceMap* aMap,const TMargins& aMargins)
+/** Adds pixel cropping margins to the picture.
+
+@param aMap The pixels to twips mapping interface of the graphics device 
+@param aMargins The additional pixel cropping margins for the picture, in pixels. */
+	{
+	GDI_ASSERT_ALWAYS_GENERAL(aMap!=NULL,User::Panic(KGdiCPicturePanicCategory,KErrNotFound));
+	TMargins cropInTwips;
+	GetCropInTwips(cropInTwips);
+	TInt scaleFactorWidth=ScaleFactorWidth();
+	if(scaleFactorWidth!=0)
+		{
+		cropInTwips.iLeft += (1000*aMap->HorizontalPixelsToTwips(aMargins.iLeft))/scaleFactorWidth;
+		cropInTwips.iRight += (1000*aMap->HorizontalPixelsToTwips(aMargins.iRight))/scaleFactorWidth;
+		}
+	TInt scaleFactorHeight=ScaleFactorHeight();
+	if(scaleFactorHeight!=0)
+		{
+		cropInTwips.iTop += (1000*aMap->VerticalPixelsToTwips(aMargins.iTop))/scaleFactorHeight;
+		cropInTwips.iBottom += (1000*aMap->VerticalPixelsToTwips(aMargins.iBottom))/scaleFactorHeight;
+		}
+	SetCropInTwips(cropInTwips);
+	}
+