19 |
19 |
20 // ----------------------------------------------------------------------------- |
20 // ----------------------------------------------------------------------------- |
21 // ----------------------------------------------------------------------------- |
21 // ----------------------------------------------------------------------------- |
22 // |
22 // |
23 CTsGraphicFileScalingHandler::CTsGraphicFileScalingHandler(MImageReadyCallBack &aNotify, |
23 CTsGraphicFileScalingHandler::CTsGraphicFileScalingHandler(MImageReadyCallBack &aNotify, |
24 const TSize &aNewSize, |
24 const TSize &aNewSize, |
25 TKindOfScaling aKindOfScaling |
25 TKindOfScaling aKindOfScaling |
26 /* = CTsGraphicFileScalingHandler::EIgnoreAspectRatio*/) : |
26 /* = CTsGraphicFileScalingHandler::EIgnoreAspectRatio*/) : |
27 CActive(EPriorityNormal), |
27 CActive(EPriorityNormal), |
28 mNotify(aNotify), |
28 mNotify(aNotify), |
29 mNewSize(aNewSize), |
29 mNewSize(aNewSize), |
30 mKindOfScaling(aKindOfScaling), |
30 mKindOfScaling(aKindOfScaling), |
31 mCurrentOperation(ENone) |
31 mCurrentOperation(ENone) |
32 { |
32 { |
|
33 CActiveScheduler::Add(this); |
33 } |
34 } |
34 |
35 |
35 // ----------------------------------------------------------------------------- |
36 // ----------------------------------------------------------------------------- |
36 // ----------------------------------------------------------------------------- |
37 // ----------------------------------------------------------------------------- |
37 // |
38 // |
38 EXPORT_C CTsGraphicFileScalingHandler::~CTsGraphicFileScalingHandler() |
39 EXPORT_C CTsGraphicFileScalingHandler::~CTsGraphicFileScalingHandler() |
39 { |
40 { |
40 Cancel(); |
41 Cancel(); |
41 delete mBitmapFromFile; |
42 delete mInputBitmap; |
42 delete mBitmapOutput; |
43 delete mOutputBitmap; |
43 delete mImageDecoder; |
44 delete mImageDecoder; |
44 delete mBitmapScaler; |
45 delete mBitmapScaler; |
45 } |
46 } |
46 |
47 |
47 // ----------------------------------------------------------------------------- |
48 // ----------------------------------------------------------------------------- |
48 // ----------------------------------------------------------------------------- |
49 // ----------------------------------------------------------------------------- |
49 // |
50 // |
50 EXPORT_C CTsGraphicFileScalingHandler* CTsGraphicFileScalingHandler::NewL(MImageReadyCallBack &aNotify, |
51 EXPORT_C CTsGraphicFileScalingHandler* CTsGraphicFileScalingHandler::NewL(MImageReadyCallBack &aNotify, |
51 RFs &aFs, |
52 RFs &aFs, |
52 const TDesC &aFileName, |
53 const TDesC &aFileName, |
53 const TDesC8& aMimeType, |
54 const TDesC8& aMimeType, |
54 const TSize &aNewSize, |
55 const TSize &aNewSize, |
55 TKindOfScaling aKindOfScaling |
56 TKindOfScaling aKindOfScaling |
56 /* = CTsGraphicFileScalingHandler::EIgnoreAspectRatio*/) |
57 /* = CTsGraphicFileScalingHandler::EIgnoreAspectRatio*/) |
57 { |
58 { |
58 CTsGraphicFileScalingHandler *self = CTsGraphicFileScalingHandler::NewLC(aNotify, |
59 CTsGraphicFileScalingHandler *self = CTsGraphicFileScalingHandler::NewLC(aNotify, |
59 aFs, |
60 aFs, |
60 aFileName, |
61 aFileName, |
61 aMimeType, |
62 aMimeType, |
62 aNewSize, |
63 aNewSize, |
63 aKindOfScaling); |
64 aKindOfScaling); |
64 CleanupStack::Pop(); |
65 CleanupStack::Pop(); |
65 return self; |
66 return self; |
66 } |
67 } |
67 |
68 |
68 // ----------------------------------------------------------------------------- |
69 // ----------------------------------------------------------------------------- |
69 // ----------------------------------------------------------------------------- |
70 // ----------------------------------------------------------------------------- |
70 // |
71 // |
71 EXPORT_C CTsGraphicFileScalingHandler* CTsGraphicFileScalingHandler::NewLC(MImageReadyCallBack &aNotify, |
72 EXPORT_C CTsGraphicFileScalingHandler* CTsGraphicFileScalingHandler::NewLC(MImageReadyCallBack &aNotify, |
72 RFs &aFs, |
73 RFs &aFs, |
73 const TDesC &aFileName, |
74 const TDesC &aFileName, |
74 const TDesC8& aMimeType, |
75 const TDesC8& aMimeType, |
75 const TSize &aNewSize, |
76 const TSize &aNewSize, |
76 TKindOfScaling aKindOfScaling |
77 TKindOfScaling aKindOfScaling |
77 /* = CTsGraphicFileScalingHandler::EIgnoreAspectRatio*/) |
78 /* = CTsGraphicFileScalingHandler::EIgnoreAspectRatio*/) |
78 { |
79 { |
79 CTsGraphicFileScalingHandler *self = new (ELeave) CTsGraphicFileScalingHandler(aNotify, |
80 CTsGraphicFileScalingHandler *self = new (ELeave) CTsGraphicFileScalingHandler(aNotify, |
80 aNewSize, |
81 aNewSize, |
81 aKindOfScaling); |
82 aKindOfScaling); |
82 |
83 |
83 CleanupStack::PushL(self); |
84 CleanupStack::PushL(self); |
84 self->ConstructL(aFs, aFileName, aMimeType); |
85 self->ConstructL(aFs, aFileName, aMimeType); |
85 return self; |
86 return self; |
86 } |
87 } |
97 |
98 |
98 if (aMimeType.Length() == 0) { |
99 if (aMimeType.Length() == 0) { |
99 User::Leave(KErrBadName); |
100 User::Leave(KErrBadName); |
100 } |
101 } |
101 |
102 |
102 if(0>=mNewSize.iWidth || 0>=mNewSize.iHeight) { |
103 if (0>=mNewSize.iWidth || 0>=mNewSize.iHeight) { |
103 User::Leave(KErrCorrupt); |
104 User::Leave(KErrCorrupt); |
104 } |
105 } |
105 |
106 |
106 CActiveScheduler::Add(this); |
107 mInputBitmap = new(ELeave)CFbsBitmap(); |
107 |
108 DecodingOperationL(aFs, aFileName, aMimeType); |
108 mBitmapScaler = CBitmapScaler::NewL(); |
109 SetActive(); |
109 mBitmapScaler->SetQualityAlgorithm(CBitmapScaler::EMaximumQuality); |
110 } |
110 |
111 |
111 // convert *.png to bitmap |
112 // ----------------------------------------------------------------------------- |
112 mImageDecoder = CImageDecoder::FileNewL(aFs, aFileName, aMimeType); |
113 // ----------------------------------------------------------------------------- |
113 mBitmapFromFile = new(ELeave)CFbsBitmap(); |
114 // |
114 const TFrameInfo frameInfo(mImageDecoder->FrameInfo(0)); |
115 EXPORT_C CTsGraphicFileScalingHandler* CTsGraphicFileScalingHandler::NewL(MImageReadyCallBack &aNotify, |
115 User::LeaveIfError(mBitmapFromFile->Create(frameInfo.iOverallSizeInPixels, |
116 const CFbsBitmap &aImputFbsBitmap, |
116 frameInfo.iFrameDisplayMode)); |
117 const TSize &aNewSize, |
117 |
118 TKindOfScaling aKindOfScaling |
118 mImageDecoder->Convert(&iStatus, *mBitmapFromFile, 0); |
119 /* = CTsGraphicFileScalingHandler::EIgnoreAspectRatio*/) |
119 mCurrentOperation = EConvertBitmapFromFile; |
120 { |
|
121 CTsGraphicFileScalingHandler *self = CTsGraphicFileScalingHandler::NewLC(aNotify, |
|
122 aImputFbsBitmap, |
|
123 aNewSize, |
|
124 aKindOfScaling); |
|
125 CleanupStack::Pop(); |
|
126 return self; |
|
127 } |
|
128 |
|
129 // ----------------------------------------------------------------------------- |
|
130 // ----------------------------------------------------------------------------- |
|
131 // |
|
132 EXPORT_C CTsGraphicFileScalingHandler* CTsGraphicFileScalingHandler::NewLC(MImageReadyCallBack &aNotify, |
|
133 const CFbsBitmap &aImputFbsBitmap, |
|
134 const TSize &aNewSize, |
|
135 TKindOfScaling aKindOfScaling |
|
136 /* = CTsGraphicFileScalingHandler::EIgnoreAspectRatio*/) |
|
137 { |
|
138 CTsGraphicFileScalingHandler *self = new (ELeave) CTsGraphicFileScalingHandler(aNotify, |
|
139 aNewSize, |
|
140 aKindOfScaling); |
|
141 |
|
142 CleanupStack::PushL(self); |
|
143 self->ConstructL(aImputFbsBitmap); |
|
144 return self; |
|
145 } |
|
146 |
|
147 // ----------------------------------------------------------------------------- |
|
148 // ----------------------------------------------------------------------------- |
|
149 // |
|
150 void CTsGraphicFileScalingHandler::ConstructL(const CFbsBitmap &aImputFbsBitmap) |
|
151 { |
|
152 if (0>=mNewSize.iWidth || 0>=mNewSize.iHeight) { |
|
153 User::Leave(KErrCorrupt); |
|
154 } |
|
155 |
|
156 mInputBitmap = new(ELeave)CFbsBitmap(); |
|
157 User::LeaveIfError(mInputBitmap->Duplicate(aImputFbsBitmap.Handle())); |
|
158 |
|
159 ScalingOperationL(); |
120 SetActive(); |
160 SetActive(); |
121 } |
161 } |
122 |
162 |
123 // ----------------------------------------------------------------------------- |
163 // ----------------------------------------------------------------------------- |
124 // ----------------------------------------------------------------------------- |
164 // ----------------------------------------------------------------------------- |
145 |
185 |
146 switch (mCurrentOperation) { |
186 switch (mCurrentOperation) { |
147 case EConvertBitmapFromFile: { |
187 case EConvertBitmapFromFile: { |
148 delete mImageDecoder; |
188 delete mImageDecoder; |
149 mImageDecoder = 0; |
189 mImageDecoder = 0; |
150 |
190 |
151 mBitmapOutput = new (ELeave)CFbsBitmap(); |
191 ScalingOperationL(); |
152 User::LeaveIfError(mBitmapOutput->Create(Scaling(), mBitmapFromFile->DisplayMode())); |
|
153 mBitmapScaler->Scale(&iStatus, *mBitmapFromFile, *mBitmapOutput, EFalse); |
|
154 mCurrentOperation = EScale; |
|
155 SetActive(); |
192 SetActive(); |
156 break; |
193 break; |
157 } |
194 } |
158 case EScale: { |
195 case EScale: { |
159 mCurrentOperation = ENone; |
196 mCurrentOperation = ENone; |
160 |
197 |
161 delete mBitmapScaler; |
198 delete mBitmapScaler; |
162 mBitmapScaler = 0; |
199 mBitmapScaler = 0; |
163 |
200 |
164 delete mBitmapFromFile; |
201 delete mInputBitmap; |
165 mBitmapFromFile = 0; |
202 mInputBitmap = 0; |
166 |
203 |
167 if (mKindOfScaling == CTsGraphicFileScalingHandler::EKeepAspectRatioByExpanding) { |
204 if (mKindOfScaling == CTsGraphicFileScalingHandler::EKeepAspectRatioByExpanding) { |
168 User::LeaveIfError(mBitmapOutput->Resize(mNewSize)); |
205 User::LeaveIfError(mOutputBitmap->Resize(mNewSize)); |
169 } |
206 } |
170 |
207 |
171 mNotify.ImageReadyCallBack(iStatus.Int(), mBitmapOutput); |
208 mNotify.ImageReadyCallBack(iStatus.Int(), mOutputBitmap); |
172 break; |
209 break; |
173 } |
210 } |
174 } |
211 } |
175 } |
212 } |
176 |
213 |
177 // ----------------------------------------------------------------------------- |
214 // ----------------------------------------------------------------------------- |
178 // ----------------------------------------------------------------------------- |
215 // ----------------------------------------------------------------------------- |
179 // |
216 // |
180 TSize CTsGraphicFileScalingHandler::Scaling() |
217 void CTsGraphicFileScalingHandler::DecodingOperationL(RFs &aFs, const TDesC &aFileName, const TDesC8& aMimeType) |
181 { |
218 { |
182 TSize originalSize = mBitmapFromFile->SizeInPixels(); |
219 // convert *.png to bitmap |
|
220 mImageDecoder = CImageDecoder::FileNewL(aFs, aFileName, aMimeType); |
|
221 const TFrameInfo frameInfo(mImageDecoder->FrameInfo(0)); |
|
222 mInputBitmap->Reset(); |
|
223 User::LeaveIfError(mInputBitmap->Create(frameInfo.iOverallSizeInPixels, |
|
224 frameInfo.iFrameDisplayMode)); |
|
225 |
|
226 mImageDecoder->Convert(&iStatus, *mInputBitmap, 0); |
|
227 mCurrentOperation = EConvertBitmapFromFile; |
|
228 } |
|
229 |
|
230 // ----------------------------------------------------------------------------- |
|
231 // ----------------------------------------------------------------------------- |
|
232 // |
|
233 void CTsGraphicFileScalingHandler::ScalingOperationL() |
|
234 { |
|
235 mBitmapScaler = CBitmapScaler::NewL(); |
|
236 mBitmapScaler->SetQualityAlgorithm(CBitmapScaler::EMaximumQuality); |
|
237 |
|
238 FixForDisplayModeNotSupportedByScalingOperation(); |
|
239 |
|
240 mOutputBitmap = new (ELeave)CFbsBitmap(); |
|
241 User::LeaveIfError(mOutputBitmap->Create(NewSizeToScalingOperation(), mInputBitmap->DisplayMode())); |
|
242 mBitmapScaler->Scale(&iStatus, *mInputBitmap, *mOutputBitmap, EFalse); |
|
243 mCurrentOperation = EScale; |
|
244 } |
|
245 |
|
246 // ----------------------------------------------------------------------------- |
|
247 // ----------------------------------------------------------------------------- |
|
248 // |
|
249 void CTsGraphicFileScalingHandler::FixForDisplayModeNotSupportedByScalingOperation() |
|
250 { |
|
251 if (EColor16MAP == mInputBitmap->DisplayMode()) { |
|
252 mInputBitmap->SetDisplayMode(EColor16MA); |
|
253 } |
|
254 } |
|
255 |
|
256 // ----------------------------------------------------------------------------- |
|
257 // ----------------------------------------------------------------------------- |
|
258 // |
|
259 TSize CTsGraphicFileScalingHandler::NewSizeToScalingOperation() |
|
260 { |
|
261 TSize originalSize = mInputBitmap->SizeInPixels(); |
183 float widthFactor = mNewSize.iWidth / (float)originalSize.iWidth; |
262 float widthFactor = mNewSize.iWidth / (float)originalSize.iWidth; |
184 float heightFactor = mNewSize.iHeight / (float)originalSize.iHeight; |
263 float heightFactor = mNewSize.iHeight / (float)originalSize.iHeight; |
185 |
264 |
186 TSize retSize(mNewSize); |
265 TSize retSize(mNewSize); |
187 |
266 |