]> code.delx.au - comingnext/blob - ComingNext_SkinFetcher/src/SkinFetcher.cpp
added first implementation of ComingNext Skin Fetcher app
[comingnext] / ComingNext_SkinFetcher / src / SkinFetcher.cpp
1 /*
2 ============================================================================
3 Name : SkinFetcher.cpp
4 Author : Michael Prager
5 Version : 1.0
6 Copyright : Licensed under GPLv3
7 Description : CSkinFetcher implementation
8 ============================================================================
9 */
10
11 #include <AknsUtils.h>
12 #include <AknsDrawUtils.h>
13 #include <ImageConversion.h>
14 #include <AknViewAppUi.h>
15 #include <AknsBasicBackgroundControlContext.h>
16 #include "SkinFetcher.h"
17
18 CSkinFetcher::CSkinFetcher()
19 {
20 // No implementation required
21 }
22
23 CSkinFetcher::~CSkinFetcher()
24 {
25 }
26
27 CSkinFetcher* CSkinFetcher::NewLC()
28 {
29 CSkinFetcher* self = new (ELeave) CSkinFetcher();
30 CleanupStack::PushL(self);
31 self->ConstructL();
32 return self;
33 }
34
35 CSkinFetcher* CSkinFetcher::NewL()
36 {
37 CSkinFetcher* self = CSkinFetcher::NewLC();
38 CleanupStack::Pop(); // self;
39 return self;
40 }
41
42 void CSkinFetcher::ConstructL()
43 {
44
45 }
46
47 void CSkinFetcher::GenerateBackgroundImage(TInt aPosition,
48 CAknAppUiBase::TAppUiOrientation aOrientation)
49 {
50 CAknAppUiBase::TAppUiOrientation oldOrientation =
51 iAvkonAppUi->Orientation();
52 iAvkonAppUi->SetOrientationL(aOrientation);
53
54 TSize screenSize;
55 if (aOrientation == CAknViewAppUi::EAppUiOrientationPortrait)
56 screenSize = TSize(360, 640);
57 else
58 screenSize = TSize(640, 360);
59 TSize outputSize = TSize(312, 82);
60
61 // draw homescreen graphics into offscreen buffer
62 CFbsBitmap* offScreenBitmap = new (ELeave) CFbsBitmap();
63 CleanupStack::PushL(offScreenBitmap);
64 User::LeaveIfError(offScreenBitmap->Create(outputSize, EColor16MA));
65 CFbsBitmapDevice* bitmapDevice = CFbsBitmapDevice::NewL(offScreenBitmap);
66 CleanupStack::PushL(bitmapDevice);
67 CFbsBitGc* bitGc = 0;
68 User::LeaveIfError(bitmapDevice->CreateContext(bitGc));
69 CleanupStack::PushL(bitGc);
70 #define COUNT 5
71 TRect outer[COUNT];
72 if (aOrientation == CAknViewAppUi::EAppUiOrientationPortrait)
73 {
74 for (int i = 0; i < COUNT; i++)
75 outer[i] = TRect(22, 136 + i * 86, 334, 136 + i * 86 + 82);
76 }
77 else
78 {
79 /* width: 312
80 * height: 82
81 * spacing x: 4
82 * spacing y: 5
83 * slot1: 322, 50, 634, 132
84 * slot2: 5, 136, 317, 218
85 */
86 for (int i = 0; i < COUNT; i++)
87 if ((i + 1) % 2 == 0)
88 outer[i] = TRect(5, 50 + (i + 1) / 2 * 86, 317, 50 + (i + 1)
89 / 2 * 86 + 82);
90 else
91 outer[i] = TRect(322, 50 + (i + 1) / 2 * 86, 634, 50 + (i + 1)
92 / 2 * 86 + 82);
93 }
94
95 MAknsSkinInstance* skin = AknsUtils::SkinInstance();
96 CAknsBasicBackgroundControlContext* context =
97 CAknsBasicBackgroundControlContext::NewL(KAknsIIDWallpaper, TRect(
98 0, 0, screenSize.iWidth, screenSize.iHeight), EFalse);
99 CleanupStack::PushL(context);
100 AknsDrawUtils::DrawBackground(skin, context, NULL, *bitGc, TPoint(0, 0),
101 outer[aPosition], KAknsDrawParamDefault);
102 TRect innerBox = TRect(outputSize);
103 innerBox.Shrink(5, 5);
104 AknsDrawUtils::DrawFrame(skin, *bitGc, TRect(outputSize), innerBox,
105 KAknsIIDQgnHomeBgWidget, KAknsIIDQgnHomeBgWidgetCenter);
106
107 // save buffer into png
108 TFileName filename;
109 if (aOrientation == CAknViewAppUi::EAppUiOrientationPortrait)
110 filename.Copy(_L("c:\\data\\background_portrait.png"));
111 else
112 filename.Copy(_L("c:\\data\\background_landscape.png"));
113 CImageEncoder* iImageEncoder = CImageEncoder::FileNewL(
114 CEikonEnv::Static()->FsSession(), filename, _L8("image/png"),CImageEncoder::EOptionAlwaysThread);
115 CleanupStack::PushL(iImageEncoder);
116 TRequestStatus iStatus = KErrNone;
117 iImageEncoder->Convert(&iStatus, *offScreenBitmap);
118 User::WaitForRequest(iStatus);
119
120 CleanupStack::PopAndDestroy(5);
121 iAvkonAppUi->SetOrientationL(oldOrientation);
122 }
123