diff -r 000000000000 -r 5d03bc08d59c graphicsdeviceinterface/gdi/sgdi/PICTURE.CPP --- /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 +#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); + } +