3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 // Licensed under the Flora License, Version 1.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.tizenopensource.org/license
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an AS IS BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
19 #include "BrowserForm.h"
20 #include "ImageConverterForm.h"
22 #include "PixelFormatMapper.h"
24 #include "UnitTestFactory.h"
26 #define SECTION_NAME L"ImageConverter"
29 using namespace Osp::Base;
30 using namespace Osp::Ui;
31 using namespace Osp::Ui::Controls;
32 using namespace Osp::Graphics;
33 using namespace Osp::Io;
36 MULTI_FORM_REGISTER(ImageConverterForm, L"ImageConverterForm");
38 DECLARE_TC(L"Image", L"2.Image Converter", ImageConverterForm::TestFunc, 0);
41 ImageConverterForm::TestFunc(void* pParam)
43 return MultiForm::ActivateForm(L"ImageConverterForm", pParam, MultiForm::GetCurrentForm(), null);
46 ImageConverterForm::ImageConverterForm(void)
48 __pButtonUseFile = null;
49 __pEditAreaLog = null;
50 __pSliderDstDim = null;
51 __pSliderDstSize = null;
59 ImageConverterForm::~ImageConverterForm(void)
61 if (__pSrcBitmap != null)
67 if (__pDstBitmap != null)
75 ImageConverterForm::Initialize()
77 Construct(L"IDF_IMAGE_CONVERTER");
83 ImageConverterForm::OnInitializing(void)
88 __imgFormatLoop[IMG_FORMAT_JPG] = IMG_FORMAT_PNG;
89 __imgFormatLoop[IMG_FORMAT_PNG] = IMG_FORMAT_BMP;
90 __imgFormatLoop[IMG_FORMAT_BMP] = IMG_FORMAT_JPG;
92 AppLog("ImageConverterForm::OnInitializing\n");
94 SetHeaderText("Image Converter");
95 SetFooterStyle(FOOTER_STYLE_BUTTON_TEXT, ID_BACK, this);
96 AddFooterItem(L"Prev", ID_PREV);
97 AddFooterItem(L"Next", ID_NEXT);
98 AddFooterItem(L"Convert", ID_CONVERT);
99 SetStepInfo(0, 0, 0, 1);
101 __pSrcBmpCtrl = BitmapControl::ConstructN(GetControl(L"IDC_BUTTON_SRCIMAGE"));
102 if (__pSrcBmpCtrl == null)
104 AppLog("BitmapControl::ConstructN failed:%s", GetErrorMessage(GetLastResult()));
105 return GetLastResult();
107 AddControl(*__pSrcBmpCtrl);
109 __pDstBmpCtrl = BitmapControl::ConstructN(GetControl(L"IDC_BUTTON_DSTIMAGE"));
110 if (__pDstBmpCtrl == null)
112 AppLog("BitmapControl::ConstructN failed:%s", GetErrorMessage(GetLastResult()));
113 return GetLastResult();
115 AddControl(*__pDstBmpCtrl);
117 __pButtonFormat = static_cast< Button* >(GetControl(L"IDC_BUTTON_FORMAT"));
118 TryCatch(__pButtonFormat != null, r = E_SYSTEM, "pButtonFormat is null");
119 __pButtonFormat->SetActionId(ID_FORMAT);
120 __pButtonFormat->AddActionEventListener(*this);
122 __pButtonUseFile = static_cast< CheckButton* >(GetControl(L"IDC_CHECKBUTTON_USEFILE"));
123 TryCatch(__pButtonUseFile != null, r = E_SYSTEM, "pButtonUseFile is null");
124 __pButtonUseFile->SetActionId(ID_USE_FILE, ID_NOT_USE_FILE);
125 __pButtonUseFile->AddActionEventListener(*this);
127 __pSliderDstDim = static_cast< Slider* >(GetControl(L"IDC_SLIDER_DIMENSION"));
128 TryCatch(__pSliderDstDim != null, r = E_SYSTEM, "pSliderDimension is null");
129 __pSliderDstDim->AddAdjustmentEventListener(*this);
131 __pSliderDstSize = static_cast< Slider* >(GetControl(L"IDC_SLIDER_FILESIZE"));
132 TryCatch(__pSliderDstSize, r = E_SYSTEM, "__pSliderFileSize is null");
133 __pSliderDstSize->AddAdjustmentEventListener(*this);
135 __pEditAreaLog = static_cast< EditArea* >(GetControl(L"IDC_EDITAREA_LOG"));
136 TryCatch(__pEditAreaLog, r = E_SYSTEM, "__pEditAreaLog is null");
137 __pEditAreaLog->SetKeypadEnabled(false);
139 FitControlBounds(*__pButtonFormat, __pSrcBmpCtrl, __pSliderDstDim, 2, 2, false);
140 FitControlBounds(*__pButtonUseFile, __pSrcBmpCtrl, __pSliderDstDim, 2, 2, false);
141 FitControlBounds(*__pSliderDstDim, __pButtonFormat, __pSliderDstSize, 2, 2, false);
142 FitControlBounds(*__pSliderDstSize, __pSliderDstDim, __pEditAreaLog, 2, 2, false);
143 AppLog("__pEditAreaLog coordinates following...");
144 FitControlBounds(*__pEditAreaLog, __pSliderDstSize, null, 2, 2, true);
146 r = __img.Construct();
147 TryCatch(r == E_SUCCESS, , "img.Construct failed:%s", GetErrorMessage(r));
154 ImageConverterForm::LoadConfig(int index)
161 result r = E_SUCCESS;
164 __dstName = __pConfig->GetContentPath(SECTION_NAME, L"dstfile");
165 __srcName = __pConfig->GetContentPath(SECTION_NAME, "%d.srcfile", index);
166 format = __pConfig->GetString(SECTION_NAME, "%d.format", index);
167 __useFile = __pConfig->GetInt(0, SECTION_NAME, "%d.usefile", index);
170 __pButtonUseFile->SetSelected(true);
171 __pButtonUseFile->RequestRedraw();
175 __pButtonUseFile->SetSelected(false);
176 __pButtonUseFile->RequestRedraw();
179 if (format.Equals(L"JPEG", false) || format.Equals(L"JPG", false))
181 __dstFormat = IMG_FORMAT_JPG;
183 else if (format.Equals(L"PNG", false))
185 __dstFormat = IMG_FORMAT_PNG;
189 __dstFormat = IMG_FORMAT_BMP;
191 SetControlText(__pButtonFormat, "Format:%s", PixelFormatMapper::GetImageFormatString(__dstFormat));
193 dstDim = __pConfig->GetInt(50, SECTION_NAME, "%d.dimension", index);
194 dstSize = __pConfig->GetInt(50, SECTION_NAME, "%d.size", index);
196 __pSliderDstDim->SetValue(dstDim);
197 if (__dstFormat == IMG_FORMAT_JPG)
199 __pSliderDstSize->SetValue(dstSize);
200 __pSliderDstSize->SetEnabled(true);
204 __pSliderDstSize->SetEnabled(false);
208 if (__pSrcBitmap != null)
214 __srcFormat = __img.GetImageFormat(__srcName);
215 __pSrcBitmap = __img.DecodeN(__srcName, BITMAP_PIXEL_FORMAT_RGB565);
216 TryCatch(__pSrcBitmap, r = GetLastResult(), "img.DecodeN failed:%s", GetErrorMessage(r));
218 __srcWidth = __pSrcBitmap->GetWidth();
219 __srcHeight = __pSrcBitmap->GetHeight();
220 __dstWidth = __srcWidth * dstDim / 100;
221 __dstHeight = __srcHeight * dstDim / 100;
223 r = File::GetAttributes(__srcName, attr);
224 TryCatch(r == E_SUCCESS, , "File::GetAttributes failed:%s", GetErrorMessage(r));
225 __srcSize = attr.GetFileSize();
226 __dstSize = __srcSize * dstSize / 100;
228 str.Format(32, L"Dimension:%dx%d", __dstWidth, __dstHeight);
229 __pSliderDstDim->SetTitleText(str);
230 __pSliderDstDim->RequestRedraw();
232 str.Format(32, L"MaxSize(JPEG only):%d KB", __dstSize / 1000);
233 __pSliderDstSize->SetTitleText(str);
234 __pSliderDstSize->RequestRedraw();
243 str.Format(32, L"Dimension:%dx%d", __dstWidth, __dstHeight);
244 __pSliderDstDim->SetTitleText(str);
245 __pSliderDstDim->RequestRedraw();
247 str.Format(32, L"MaxSize(JPEG only):%d KB", __dstSize / 1000);
248 __pSliderDstSize->SetTitleText(str);
249 __pSliderDstSize->RequestRedraw();
255 ImageConverterForm::OnActivate(void* param)
257 int count = __pConfig->GetInt(0, SECTION_NAME, L"count");
258 SetStepInfo(count, 0, 0, 1);
262 SendUserEvent(ID_PROCESS, 0);
269 ImageConverterForm::Process(int index)
271 result r = E_SUCCESS;
273 r = LoadConfig(index);
274 TryCatch(r == E_SUCCESS, , "LoadConfig(i) failed:%s", 0, GetErrorMessage(r));
276 TryCatch(__pSrcBitmap, r = E_SYSTEM, "pSrcBitmap is null");
278 r = __useFile ? ConvertFile() : ConvertBuffer();
279 TryCatch(r == E_SUCCESS, , "Convert() failed:%s", GetErrorMessage(r));
280 TryCatch(__pDstBitmap, r = E_SYSTEM, "pDstBitmap is null");
282 __pSrcBmpCtrl->SetBitmap(*__pSrcBitmap);
283 __pSrcBmpCtrl->RequestRedraw();
285 __pDstBmpCtrl->SetBitmap(*__pDstBitmap);
286 __pDstBmpCtrl->RequestRedraw();
293 ImageConverterForm::OnActionPerformed(const Osp::Ui::Control& source, int actionId)
295 result r = E_SUCCESS;
301 AppLog("Go back to ImageViewer form\n");
308 int index = PrevStep();
316 int index = NextStep();
324 r = __useFile ? ConvertFile() : ConvertBuffer();
331 __dstFormat = __imgFormatLoop[__dstFormat];
332 SetControlText(__pButtonFormat, "Format:%s", PixelFormatMapper::GetImageFormatString(__dstFormat));
333 if (__dstFormat == IMG_FORMAT_JPG)
335 __pSliderDstSize->SetEnabled(true);
336 __pSliderDstSize->RequestRedraw();
340 __pSliderDstSize->SetEnabled(false);
341 __pSliderDstSize->RequestRedraw();
349 case ID_NOT_USE_FILE:
360 ImageConverterForm::OnUserEventReceivedN(RequestId requestId, Osp::Base::Collection::IList* pArgs)
362 result r = E_SUCCESS;
366 int index = CurrStep();
374 ImageConverterForm::ConvertBuffer()
376 result r = E_SUCCESS;
377 Osp::Graphics::Bitmap* pTmpBitmap = null;
378 Osp::Base::ByteBuffer* pTmpBuffer = null;
379 Osp::Base::ByteBuffer* pDstBuffer = null;
380 Osp::Base::ByteBuffer srcBuffer;
383 r = file.Construct(__srcName, "rb");
384 TryCatch(r == E_SUCCESS, r = GetLastResult();
386 SetControlText(__pEditAreaLog, "Result:%s(file.Construct)", GetErrorMessage(r)),
387 "file.Construct failed:%s", GetErrorMessage(r));
389 r = srcBuffer.Construct(__srcSize);
390 TryCatch(r == E_SUCCESS, r = GetLastResult();
392 SetControlText(__pEditAreaLog, "Result:%s(ByteBuffer)", GetErrorMessage(r)),
393 "srcBuffer.Construct failed:%s", GetErrorMessage(r));
395 r = file.Read(srcBuffer);
396 TryCatch(r == E_SUCCESS, r = GetLastResult();
398 SetControlText(__pEditAreaLog, "Result:%s(file.Read)", GetErrorMessage(r)),
399 "file.Read failed:%s", GetErrorMessage(r));
402 if (__srcWidth != __dstWidth || __srcHeight != __dstHeight)
404 pTmpBitmap = __img.DecodeN(srcBuffer, __srcFormat, BITMAP_PIXEL_FORMAT_RGB565, __dstWidth, __dstHeight);
408 pTmpBitmap = __img.DecodeN(srcBuffer, __srcFormat, BITMAP_PIXEL_FORMAT_RGB565);
413 SetControlText(__pEditAreaLog, "Result:%s", GetErrorMessage(r)),
414 "img.DecodeN failed:%s", GetErrorMessage(r));
416 pDstBuffer = __img.EncodeToBufferN(*pTmpBitmap, __dstFormat);
417 TryCatch(pDstBuffer, r = GetLastResult();
419 SetControlText(__pEditAreaLog, "Result:%s", GetErrorMessage(r)),
420 "img.EncodeToBufferN failed:%s", GetErrorMessage(r));
422 if (__dstFormat == IMG_FORMAT_JPG)
424 if (__dstSize < pDstBuffer->GetLimit())
426 pTmpBuffer = pDstBuffer;
427 pDstBuffer = __img.CompressJpegN(*pTmpBuffer, __dstSize);
428 TryCatch(pDstBuffer, r = GetLastResult();
430 SetControlText(__pEditAreaLog, "Result:%s", GetErrorMessage(r)),
431 "img.CompressJpegN failed:%s %d %d %d %d", GetErrorMessage(GetLastResult()),
432 pTmpBuffer->GetPosition(), pTmpBuffer->GetLimit(),
433 __srcSize, __dstSize);
440 if (__pDstBitmap != null)
445 __encodedSize = pDstBuffer->GetLimit();
447 __pDstBitmap = __img.DecodeN(*pDstBuffer, __dstFormat, BITMAP_PIXEL_FORMAT_RGB565);
448 TryCatch(__pDstBitmap, r = GetLastResult();
450 SetControlText(__pEditAreaLog, "Result:%s", GetErrorMessage(r)),
451 "img.DecodeN failed:%s %d %d", GetErrorMessage(GetLastResult()), __dstFormat, pDstBuffer->GetCapacity());
454 if (pTmpBitmap != null)
460 if (pTmpBuffer != null)
466 if (pDstBuffer != null)
476 ImageConverterForm::ConvertFile()
478 result r = E_SUCCESS;
479 Osp::Graphics::Bitmap* pTmpBitmap = null;
480 Osp::Base::ByteBuffer* pTmpBuffer = null;
481 Osp::Base::ByteBuffer* pDstBuffer = null;
483 if (__srcWidth == __dstWidth && __srcHeight == __dstHeight && __srcFormat == IMG_FORMAT_JPG)
485 FileAttributes encodedAttr;
487 r = __img.CompressJpeg(__srcName, __dstName, __dstSize);
488 if (__pDstBitmap != null)
494 __pDstBitmap = __img.DecodeN(__dstName, BITMAP_PIXEL_FORMAT_RGB565);
495 TryCatch(__pDstBitmap, r = GetLastResult();
497 SetControlText(__pEditAreaLog, "Result:%s", GetErrorMessage(r)),
498 "img.DecodeN failed:%s", GetErrorMessage(r));
500 r = File::GetAttributes(__dstName, encodedAttr);
501 TryCatch(r == E_SUCCESS, __encodedSize = 0;
502 SetControlText(__pEditAreaLog, "Result:%s Failed to get encoded file size.",
504 "File.GetAttributes failed:%s", GetErrorMessage(r));
505 __encodedSize = encodedAttr.GetFileSize();
507 else if (__srcWidth == __dstWidth && __srcHeight == __dstHeight && __srcSize == __dstSize)
509 pTmpBuffer = __img.ConvertN(__srcName, __dstFormat);
510 TryCatch(pTmpBuffer, r = GetLastResult();
512 SetControlText(__pEditAreaLog, "Result:%s", GetErrorMessage(r)),
513 "img.ConvertN failed:%s", GetErrorMessage(r));
520 __pDstBitmap = __img.DecodeN(*pTmpBuffer, __srcFormat, BITMAP_PIXEL_FORMAT_RGB565);
521 TryCatch(__pDstBitmap, r = GetLastResult();
523 SetControlText(__pEditAreaLog, "Result:%s", GetErrorMessage(r)),
524 "img.DecodeN failed:%s", GetErrorMessage(r));
526 __encodedSize = pTmpBuffer->GetLimit();
530 if (__srcWidth != __dstWidth || __srcHeight != __dstHeight)
532 pTmpBitmap = __img.DecodeN(__srcName, BITMAP_PIXEL_FORMAT_RGB565, __dstWidth, __dstHeight);
536 pTmpBitmap = __img.DecodeN(__srcName, BITMAP_PIXEL_FORMAT_RGB565);
541 SetControlText(__pEditAreaLog, "Result:%s(DecodeN)", GetErrorMessage(r)),
542 "img.DecodeN failed:%s", GetErrorMessage(r));
544 if (__dstFormat == IMG_FORMAT_JPG)
547 pTmpBuffer = __img.EncodeToBufferN(*pTmpBitmap, IMG_FORMAT_JPG);
548 TryCatch(pTmpBuffer, r = GetLastResult();
550 SetControlText(__pEditAreaLog, "Result:%s", GetErrorMessage(r)),
551 "img.EncodeToBufferN failed:%s", GetErrorMessage(r));
553 if (__dstSize < pTmpBuffer->GetCapacity())
555 pDstBuffer = __img.CompressJpegN(*pTmpBuffer, __dstSize);
556 TryCatch(pDstBuffer, r = GetLastResult();
558 SetControlText(__pEditAreaLog, "Result:%s", GetErrorMessage(r)),
559 "img.CompressJpeg failed:%s %d %d %d %d", GetErrorMessage(GetLastResult()),
560 pTmpBuffer->GetPosition(), pTmpBuffer->GetLimit(), pTmpBuffer->GetCapacity(), __dstSize);
564 pDstBuffer = pTmpBuffer;
567 r = file.Construct(__dstName, "wb");
568 TryCatch(r == E_SUCCESS, __encodedSize = 0;
569 SetControlText(__pEditAreaLog, "Result:%s", GetErrorMessage(r)),
570 "file.Construct failed:%s", GetErrorMessage(r));
572 r = file.Write(*pDstBuffer);
573 TryCatch(r == E_SUCCESS, __encodedSize = 0;
574 SetControlText(__pEditAreaLog, "Result:%s", GetErrorMessage(r)),
575 "file.Write failed:%s", GetErrorMessage(r));
576 __encodedSize = pDstBuffer->GetLimit();
580 FileAttributes encodedAttr;
582 r = __img.EncodeToFile(*pTmpBitmap, __dstFormat, __dstName, true);
583 TryCatch(r == E_SUCCESS, __encodedSize = 0;
584 SetControlText(__pEditAreaLog, "Result:%s", GetErrorMessage(r)),
585 "img.EncodeToFile failed:%s", GetErrorMessage(r));
587 r = File::GetAttributes(__dstName, encodedAttr);
588 TryCatch(r == E_SUCCESS, __encodedSize = 0;
589 SetControlText(__pEditAreaLog, "Result:%s Failed to get encoded file size.",
591 "File.GetAttributes failed:%s", GetErrorMessage(r));
592 __encodedSize = encodedAttr.GetFileSize();
595 if (__pDstBitmap != null)
601 __pDstBitmap = __img.DecodeN(__dstName, BITMAP_PIXEL_FORMAT_RGB565);
602 TryCatch(__pDstBitmap, r = GetLastResult();
604 SetControlText(__pEditAreaLog, "Result:%s", GetErrorMessage(r)),
605 "img.DecodeN failed:%s", GetErrorMessage(r));
608 if (pTmpBitmap != null)
613 if (pTmpBuffer != null)
618 if (pDstBuffer != null)
628 ImageConverterForm::OnAdjustmentValueChanged(const Osp::Ui::Control& source, int adjustment)
632 if (&source == __pSliderDstDim)
634 int dstDim = __pSliderDstDim->GetValue();
635 __dstWidth = __srcWidth * dstDim / 100;
636 __dstHeight = __srcHeight * dstDim / 100;
638 str.Format(32, L"Dimension:%dx%d", __dstWidth, __dstHeight);
639 __pSliderDstDim->SetTitleText(str);
640 __pSliderDstDim->RequestRedraw();
642 else if (&source == __pSliderDstSize)
644 int dstSize = __pSliderDstSize->GetValue();
645 __dstSize = __srcSize * dstSize / 100;
647 str.Format(32, L"MaxSize(JPEG only):%d KB", __dstSize / 1000);
648 __pSliderDstSize->SetTitleText(str);
649 __pSliderDstSize->RequestRedraw();
654 ImageConverterForm::UpdateLog(result r)
656 SetControlText(__pEditAreaLog, __srcName);
657 if (__dstFormat == IMG_FORMAT_JPG)
659 AppendControlText(__pEditAreaLog, "\nFormat:%s=>%s\nDim:%dx%d=>%dx%d\nUseFile:%s\nSize limit: %d\nEncoded size: %d\nResult:%s",
660 PixelFormatMapper::GetImageFormatString(__srcFormat),
661 PixelFormatMapper::GetImageFormatString(__dstFormat),
662 __srcWidth, __srcHeight, __dstWidth, __dstHeight,
663 __useFile ? "true" : "false",
664 __dstSize, __encodedSize,
669 AppendControlText(__pEditAreaLog, "\nFormat:%s=>%s\nDim:%dx%d=>%dx%d\nUseFile:%s\nResult:%s",
670 PixelFormatMapper::GetImageFormatString(__srcFormat),
671 PixelFormatMapper::GetImageFormatString(__dstFormat),
672 __srcWidth, __srcHeight, __dstWidth, __dstHeight,
673 __useFile ? "true" : "false",
679 ImageConverterForm::OnFormBackRequested(Osp::Ui::Controls::Form& source)
681 AppLog("ImageConverterForm::OnFormBackRequested called");
682 __pEditAreaLog->Clear();
684 if (__pSrcBitmap != null)
690 if (__pDstBitmap != null)
696 __pSrcBmpCtrl->SetBitmap(*__pSrcBitmap);
697 __pDstBmpCtrl->SetBitmap(*__pDstBitmap);