--- /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