imaging/imagingfws/ImageDisplay/plugins/Exif/ExifImageDisplay.cpp
changeset 0 5752a19fdefe
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imaging/imagingfws/ImageDisplay/plugins/Exif/ExifImageDisplay.cpp	Wed Aug 25 12:29:52 2010 +0300
@@ -0,0 +1,155 @@
+// Copyright (c) 2005-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:
+//
+
+/** 	@file
+	@internalComponent */
+#include <iclexif.h>
+#include <exifutility.h>
+#include <icl/icl_uids.hrh>
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <icl/icl_uids_const.hrh>
+#include <icl/icl_uids_def.hrh>
+#endif
+#include "ExifImageDisplayPanic.h"
+
+#include "ExifImageDisplay.h"
+
+_LIT(KExifPanicCat, "ExifImageDisplay");
+
+CExifImageDisplayPlugin* CExifImageDisplayPlugin::NewL()
+	{
+	CExifImageDisplayPlugin* self = new(ELeave) CExifImageDisplayPlugin();
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CExifImageDisplayPlugin::~CExifImageDisplayPlugin()
+	{
+	}
+
+CExifImageDisplayPlugin::CExifImageDisplayPlugin():
+							CGenericImageDisplayPlugin(KExifPanicCat)
+	{
+	iMaxUnscaledSize.SetSize(160,120);
+	iMaxReductionFactor = KMaxReductionFactor;
+	}
+
+void CExifImageDisplayPlugin::AfterOpenL()
+	{
+	GetExifMetadataReader(iExifReader);
+	}
+
+TInt CExifImageDisplayPlugin::ExtensionInterface(TUid aIFaceUid, TAny*& aIFacePtr)
+	{
+	if (KErrNone == CGenericImageDisplayPlugin::ExtensionInterface(aIFaceUid, aIFacePtr))
+		{
+		return KErrNone;
+		}
+	if (aIFaceUid != KExifImageDisplayExtensionUid)
+		{
+		return KErrNotSupported;
+		}
+	aIFacePtr = static_cast<MExifImageDisplayExtension*>(this);
+	return KErrNone;
+	}
+
+TUint CExifImageDisplayPlugin::ImageStatus() const
+	{
+	return CImageDisplay::EImageSingleFrame | (ThumbnailExists()?CImageDisplay::EImageHasThumbnail:0);
+	}
+
+TInt CExifImageDisplayPlugin::GetExifMetadataReader(MExifMetadataReader*& aPtr)
+	{
+	// it should be safe since we've asked for EXIF decoder during decoder creation
+	aPtr=static_cast<CJPEGExifDecoder*>(iDecoder)->ExifMetadata();
+	return (aPtr==NULL)? KErrNotSupported : KErrNone;
+	}
+
+const TUid CExifImageDisplayPlugin::Uid() const
+	{
+	return KExifImageDisplayExtensionUid;
+	}
+
+void CExifImageDisplayPlugin::Release()
+	{
+	}
+	
+TInt CExifImageDisplayPlugin::SetScaleQuality(TInt aQualityLevel)
+	{
+	return DoSetScaleQuality(aQualityLevel);
+	}
+	
+TInt CExifImageDisplayPlugin::SetMaximumReductionFactor(TInt aMaxReductionFactor)
+	{
+	return DoSetMaximumReductionFactor(aMaxReductionFactor);
+	}
+
+TBool CExifImageDisplayPlugin::ThumbnailExists() const
+	{
+	if (iExifReader==NULL)
+		{
+		return EFalse;
+		}
+	TExifReaderUtility util(iExifReader);
+	TUint16 dummy;
+	return (KErrNone == util.GetThumbCompression(dummy));
+	}
+
+TUint CExifImageDisplayPlugin::EffectiveRotation() const
+	{
+	TUint rotation=Options() & ( CImageDisplay::EOptionMirrorVertical |
+			(CImageDisplay::EOptionMirrorVertical - CImageDisplay::EOptionRotateCw90) );
+
+// calculate autorotation option for main image
+	if ( (Options() & CImageDisplay::EOptionAutoRotate) && iExifReader)
+		{
+		TExifReaderUtility utility(iExifReader);
+		TUint16 orientation(0);
+		TInt err=KErrNotFound;
+		if (ThumbnailRequested())
+			{
+			err=utility.GetThumbOrientation(orientation);
+			}
+		if (err!=KErrNone)
+			{
+			err = utility.GetOrientation(orientation);
+			}
+		if (KErrNone == err && orientation>0 && orientation<9)
+			{
+			// auto-rotation table using the EXIF 2.2 page 18
+			static const TUint 
+			KOrientation2Rotation[8]=	{
+										0, // 1
+										CImageDisplay::EOptionMirrorVertical, // 2
+										CImageDisplay::EOptionRotateCw180, // 3
+										CImageDisplay::EOptionMirrorHorizontal,	// 4
+										CImageDisplay::EOptionRotateCw90|CImageDisplay::EOptionMirrorVertical,		// 5
+										CImageDisplay::EOptionRotateCw90,		// 6
+										CImageDisplay::EOptionRotateCw270|CImageDisplay::EOptionMirrorVertical,		// 7
+										CImageDisplay::EOptionRotateCw270,		// 8
+										};
+			rotation = KOrientation2Rotation[orientation-1];
+			}
+		}
+	return rotation;
+	}
+
+TUid CExifImageDisplayPlugin::RequiredImageClass() const
+	{
+	return TUid::Uid(KUidICLJpegEXIFInterface);
+	}
+