diff -r 57d4cdd99204 -r edfc90759b9f imageeditor/ImageEditorUI/src/ColorSelectionGrid.cpp --- /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 +#include +#include +#include +#include +#include + +#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* icons = + new (ELeave) CAknIconArray (KColorGridRows * KColorGridCols); + CleanupStack::PushL(icons); + + // Get reference to grid item text array + MDesCArray * array = Model()->ItemTextArray(); + CDesCArray * cArray = static_cast(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