imageeditor/ImageEditorUI/src/ColorSelectionGrid.cpp
changeset 1 edfc90759b9f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imageeditor/ImageEditorUI/src/ColorSelectionGrid.cpp	Fri Jan 29 13:53:17 2010 +0200
@@ -0,0 +1,384 @@
+/*
+* Copyright (c) 2010 Ixonos Plc.
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the "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:
+* Ixonos Plc
+*
+* Description:  
+*
+*/
+
+
+//	INCLUDE
+#include <aknview.h>
+#include <aknlists.h> 
+#include <barsread.h>
+#include <akniconarray.h> 
+#include <gulicon.h>
+#include <aknutils.h>
+
+#include "ColorSelectionGrid.h"
+#include "ResolutionUtil.h"
+
+const TInt KColorGridRows = 8;
+const TInt KColorGridCols = 14;
+
+const TInt KStandardGridSizeWidth = 12;
+const TInt KStandardGridSizeHeight = 12;
+const TInt KQVGAGridSizeWidth = 15;
+const TInt KQVGAGridSizeHeight = 15;
+const TInt KDoubleGridSizeWidth = 24;
+const TInt KDoubleGridSizeHeight = 24;
+const TInt KHVGAGridSizeWidth = 20;
+const TInt KHVGAGridSizeHeight = 20;
+const TInt KVGAGridSizeWidth = 31;
+const TInt KVGAGridSizeHeight = 26;
+const TInt KQHDGridSizeWidth = 22;
+const TInt KQHDGridSizeHeight = 22;
+
+const TInt KStandardIconSizeWidth = 9;
+const TInt KStandardIconSizeHeight = 9;
+const TInt KQVGAIconSizeWidth = 11;
+const TInt KQVGAIconSizeHeight = 11;
+const TInt KDoubleIconSizeWidth = 18;
+const TInt KDoubleIconSizeHeight = 18;
+const TInt KHVGAIconSizeWidth = 15;
+const TInt KHVGAIconSizeHeight = 15;
+const TInt KVGAIconSizeWidth = 26;
+const TInt KVGAIconSizeHeight = 22;
+const TInt KQHDIconSizeWidth = 17;
+const TInt KQHDIconSizeHeight = 17;
+
+
+
+//=============================================================================
+EXPORT_C CColorSelectionGrid::CColorSelectionGrid () 
+: CAknGrid ()
+{
+
+}
+
+//=============================================================================
+EXPORT_C CColorSelectionGrid::~CColorSelectionGrid ()
+{
+
+}
+
+//=============================================================================
+EXPORT_C void CColorSelectionGrid::ConstructL (
+    const CCoeControl *     aParent,  
+    TInt                    aFlags 
+    )
+{
+    //  Construct base instance
+    CAknGrid::ConstructL (aParent, aFlags);
+
+    //  Get the screen mode from the Resolution Util
+    TInt screenMode = CResolutionUtil::Self()->GetScreenMode();
+
+    switch (screenMode)
+    {
+
+    case CResolutionUtil::EDouble:
+    case CResolutionUtil::EDoubleFullScreen:
+    case CResolutionUtil::EDoubleLandscape:
+    case CResolutionUtil::EDoubleLandscapeFullScreen:
+        {
+        iGridSize.SetSize(
+            KDoubleGridSizeWidth, 
+            KDoubleGridSizeHeight);
+
+        iIconSize.SetSize(
+            KDoubleIconSizeWidth,
+            KDoubleIconSizeHeight);
+        break;
+
+        }
+    // QVGA
+    case CResolutionUtil::EQVGA:
+    case CResolutionUtil::EQVGAFullScreen:
+    case CResolutionUtil::EQVGALandscape:
+    case CResolutionUtil::EQVGALandscapeFullScreen:
+        {
+        iGridSize.SetSize(
+            KQVGAGridSizeWidth, 
+            KQVGAGridSizeHeight);
+
+        iIconSize.SetSize(
+            KQVGAIconSizeWidth,
+            KQVGAIconSizeHeight);
+
+        break;
+        }
+    // HVGA
+    case CResolutionUtil::EHVGA:
+    case CResolutionUtil::EHVGAFullScreen:
+    case CResolutionUtil::EHVGALandscape:
+    case CResolutionUtil::EHVGALandscapeFullScreen:
+        {
+        iGridSize.SetSize(
+            KHVGAGridSizeWidth, 
+            KHVGAGridSizeHeight);
+
+        iIconSize.SetSize(
+            KHVGAIconSizeWidth,
+            KHVGAIconSizeHeight);
+
+        break;
+        }
+    // VGA    
+    case CResolutionUtil::EVGA:
+    case CResolutionUtil::EVGAFullScreen:
+    case CResolutionUtil::EVGALandscape:
+    case CResolutionUtil::EVGALandscapeFullScreen:
+        {
+        iGridSize.SetSize(
+            KVGAGridSizeWidth, 
+            KVGAGridSizeHeight);
+
+        iIconSize.SetSize(
+            KVGAIconSizeWidth,
+            KVGAIconSizeHeight);
+
+        break;
+        } 
+    // QHD    
+    case CResolutionUtil::EQHD:
+    case CResolutionUtil::EQHDFullScreen:
+    case CResolutionUtil::EQHDLandscape:
+    case CResolutionUtil::EQHDLandscapeFullScreen:
+        {
+        iGridSize.SetSize(
+            KQHDGridSizeWidth, 
+            KQHDGridSizeHeight);
+
+        iIconSize.SetSize(
+            KQHDIconSizeWidth,
+            KQHDIconSizeHeight);
+
+        break;
+        }       
+    default:  
+        {
+        iGridSize.SetSize(
+            KStandardGridSizeWidth, 
+            KStandardGridSizeHeight);
+
+        iIconSize.SetSize(
+            KStandardIconSizeWidth,
+            KStandardIconSizeHeight);
+
+        break;
+        }
+    }
+    //  Set grid layout
+    SetLayoutL (
+        EFalse, 
+        ETrue, 
+        ETrue, 
+        KColorGridCols, 
+        KColorGridRows, 
+        iGridSize);
+    
+    // Set scroll bar invisible
+    ScrollBarFrame()->
+        SetScrollBarVisibilityL( CEikScrollBarFrame::EOff, 
+                                 CEikScrollBarFrame::EOff );  
+                                 
+    SetPrimaryScrollingType (CAknGridView::EScrollStops);
+    SetSecondaryScrollingType (CAknGridView::EScrollStops);
+    
+    SetCurrentDataIndex (0);
+        
+	//	Set up the icons
+	SetupGridIconsL ();
+	
+	// Draw the grid
+	SizeChanged();
+}
+
+//=============================================================================
+EXPORT_C void CColorSelectionGrid::SizeChanged()
+{
+	CAknGrid::SizeChanged();
+	SetupGrid();
+}
+
+//=============================================================================
+void CColorSelectionGrid::SetupGridIconsL ()
+{
+	//	Create icon array
+	CArrayPtr<CGulIcon>* icons = 
+		new (ELeave) CAknIconArray (KColorGridRows * KColorGridCols);
+	CleanupStack::PushL(icons);
+
+    //  Get reference to grid item text array
+    MDesCArray * array = Model()->ItemTextArray();
+    CDesCArray * cArray = static_cast<CDesCArray *>(array);
+
+	//	Create icon bitmaps and add them to the array
+	TInt index = 0;
+	for (TInt i = 0; i < KColorGridRows; ++i)
+	{
+		for (TInt j = 0; j < KColorGridCols; ++j)
+		{
+            //  Create grid item bitmap    
+            CFbsBitmap * bitmap = new (ELeave) CFbsBitmap;
+            CleanupStack::PushL( bitmap );
+            User::LeaveIfError (bitmap->Create (iIconSize, EColor64K) );
+
+            //  Compute color for bitmap
+            TRgb color (255, 255, 255);
+			if (j == 0)
+			{
+				color = HSLtoRGB (0.0, 0.0, i * (1.0 / 7.0));
+
+			}
+			else
+			{
+				color = HSLtoRGB (i * (360.0 / 8.0), 1.0, j * (1.0 / 14.0));
+			}
+             
+			//	Fill the bitmap with the correct color
+			TUint16 color_64k = (TUint16)
+				(0 | 
+				(((TUint8)color.Red() >> 3) << 11) | 
+				(((TUint8)color.Green() >> 2) << 5) | 
+				((TUint8)color.Blue() >> 3));
+
+            bitmap->LockHeapLC();
+			TUint16 * pd = (TUint16 *)bitmap->DataAddress();
+			TSize size = bitmap->SizeInPixels();
+			TInt w = (bitmap->ScanLineLength(size.iWidth, EColor64K) >> 1) * size.iHeight;
+			for (TInt k = w; k != 0; --k)
+			{
+				*pd++ = color_64k;
+			}
+            CleanupStack::PopAndDestroy(); // LockHeapLC()
+
+            //  Add item to the grid
+            icons->AppendL ( CGulIcon::NewL (bitmap, 0) );
+
+            CleanupStack::Pop(); // bitmap
+
+            //  Create grid item text
+            TBuf<256> buf;
+            buf.AppendNum (index);
+            buf.Append(KAknStripTabs);
+            buf.AppendNum ((TInt)color.Value());
+            cArray->AppendL (buf);
+			++index; 
+		}
+	}
+	CleanupStack::Pop(icons);	// icons
+
+	//	Set icons to the grid
+	ItemDrawer()->FormattedCellData()->SetIconArray(icons);
+
+    //  Handle item addition
+    HandleItemAdditionL();
+}
+
+//=============================================================================
+void CColorSelectionGrid::SetupGrid ()
+{
+	// Setup text foreground and background colours to default
+	AknListBoxLayouts::SetupStandardGrid (*this);
+
+	// Get local copies of data we will need	
+	CFormattedCellListBoxItemDrawer * itemDrawer = this->ItemDrawer();
+	TInt cell_w = ColumnWidth(); 
+	TInt cell_h = ItemHeight();
+	
+	// Set up graphics sub-cells
+	AknListBoxLayouts::SetupFormGfxCell (
+		*this,						// the grid
+		itemDrawer,					// the grid's drawer
+		0,							// index of the graphic within item strings
+		0,							// left position
+		0,							//	top position
+		0,							// right - unused
+		0,							// bottom - unused
+		cell_w ,					// width of graphic
+		cell_h,						// height of graphic
+		TPoint (0, 0),				// start position
+		TPoint (cell_w, cell_h)		// end position
+		);
+}
+
+//=============================================================================
+TRgb CColorSelectionGrid::HSLtoRGB (
+	const TReal aH, 
+	const TReal aS, 
+	const TReal aL
+	) const
+{
+	TRgb rgb;
+
+	if (aS == 0.0)
+	{
+		rgb.SetRed ((TInt)(aL * 255.0));
+		rgb.SetGreen((TInt)(aL * 255.0));
+		rgb.SetBlue((TInt)(aL * 255.0));
+	}
+	else
+	{
+		TReal rm1, rm2;
+		if (aL <= 0.5)
+		{
+			rm2 = aL + aL * aS;
+		}
+		else
+		{
+			rm2 = aL + aS - aL * aS;
+		}
+		rm1 = 2.0 * aL - rm2;   
+		
+		rgb.SetRed (ToRGB (rm1, rm2, aH + 120.0));
+		rgb.SetGreen (ToRGB (rm1, rm2, aH));
+		rgb.SetBlue (ToRGB (rm1, rm2, aH - 120.0));
+	}
+
+	return rgb;
+}
+
+//=============================================================================
+TInt CColorSelectionGrid::ToRGB (
+	TReal aRM1, 
+	TReal aRM2, 
+	TReal aRH
+	) const
+{
+  if (aRH > 360.0)
+  {
+	  aRH -= 360.0;
+  }
+  else if (aRH < 0.0)
+  {
+	  aRH += 360.0;
+  }
+ 
+  if (aRH < 60.0)
+  {	
+	  aRM1 = aRM1 + (aRM2 - aRM1) * aRH / 60.0;
+  }
+  else if (aRH < 180.0)
+  {
+	  aRM1 = aRM2;
+  }
+  else if (aRH < 240.0) 
+  {
+	  aRM1 = aRM1 + (aRM2 - aRM1) * (240.0f - aRH) / 60.0;
+  }
+  return (TInt)(aRM1 * 255.0);
+}
+
+// End of File