2 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
4 // Licensed under the Flora License, Version 1.1 (the License);
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
8 // http://floralicense.org/license/
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an AS IS BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
18 * @file IvImageCrop.cpp
19 * @brief This is the implementation file for Image Crop.
26 #include "IvImageCropForm.h"
27 #include "IvImageViewerApp.h"
28 #include "IvImageViewerPresentationModel.h"
29 #include "IvResourceManager.h"
32 using namespace Tizen::App;
33 using namespace Tizen::Base;
34 using namespace Tizen::Base::Collection;
35 using namespace Tizen::Content;
36 using namespace Tizen::Graphics;
37 using namespace Tizen::Io;
38 using namespace Tizen::Media;
39 using namespace Tizen::System;
40 using namespace Tizen::Social;
41 using namespace Tizen::Ui::Controls;
42 using namespace Tizen::Ui::Scenes;
44 static const unsigned int CROP_BOX_RECTANGLE_COLOR = Color32<199, 110, 6>::Value;
45 static const int CROP_BOX_LINE_WIDTH = 5;
47 ImageCropForm::ImageCropForm(void)
48 : __cropMode(APPCONTROL_DATA_AUTO)
51 , __isOrientationChanged(false)
53 , __pCurrentBitmap(null)
54 , __pRectangleBitmap(null)
55 , __pointLocation(OUTSIDE_CROPBOX)
56 , __pPresentationModel(null)
63 ImageCropForm::~ImageCropForm(void)
65 if (__pCurrentBitmap != null)
67 delete __pCurrentBitmap;
69 if (__pRectangleBitmap != null)
71 delete __pRectangleBitmap;
73 if (__pCanvas != null)
80 ImageCropForm::Initialize(void)
82 Form::Construct(IDL_FORM_IMAGE_CROP);
83 Form::SetFormStyle(FORM_STYLE_NORMAL | FORM_STYLE_INDICATOR);
85 __pPresentationModel = ImageViewerPresentationModel::GetInstance();
91 ImageCropForm::OnInitializing(void)
93 AppResource* pAppResource = null;
94 Bitmap* pSaveButtonBitmap = null;
95 Bitmap* pCancelButtonBitmap = null;
97 Button* pSaveButton = null;
98 Button* pCancelButton = null;
99 pAppResource = UiApp::App::GetInstance()->GetAppResource();
100 if (pAppResource != null)
102 pSaveButtonBitmap = pAppResource->GetBitmapN(IDB_IMAGE_CROP_FORM_SAVE_ICON);
103 pCancelButtonBitmap = pAppResource->GetBitmapN(IDB_IMAGE_CROP_FORM_CANCEL_ICON);
104 __pRectangleBitmap = pAppResource->GetBitmapN(IDB_IMAGE_CROP_RECTANGLE);
107 pPanel = static_cast<Panel*>(GetControl(L"IDC_FOOTER_PANEL"));
110 pSaveButton = static_cast<Button*>(pPanel->GetControl(L"IDC_SAVE_BUTTON"));
111 if (pSaveButton != null && pSaveButtonBitmap != null)
113 Point startPoint((pSaveButton->GetWidth() - pSaveButtonBitmap->GetWidth()) / 2,
114 (pSaveButton->GetHeight() - pSaveButtonBitmap->GetHeight()) / 2);
115 pSaveButton->SetNormalBitmap(startPoint, *pSaveButtonBitmap);
116 pSaveButton->AddActionEventListener(*this);
117 pSaveButton->SetActionId(IDA_BUTTON_SAVE);
118 delete pSaveButtonBitmap;
121 pCancelButton = static_cast<Button*>(pPanel->GetControl(L"IDC_CANCEL_BUTTON"));
122 if (pCancelButton != null && pCancelButtonBitmap != null)
124 Point startPoint((pCancelButton->GetWidth() - pCancelButtonBitmap->GetWidth()) / 2,
125 (pCancelButton->GetHeight() - pCancelButtonBitmap->GetHeight()) / 2);
126 pCancelButton->SetNormalBitmap(startPoint, *pCancelButtonBitmap);
127 pCancelButton->AddActionEventListener(*this);
128 pCancelButton->SetActionId(IDA_BUTTON_CANCEL);
129 delete pCancelButtonBitmap;
132 SetControlAlwaysOnTop(*pPanel, true);
133 Label* pLabel = static_cast<Label*>(pPanel->GetControl(L"IDC_PANEL_LABEL"));
136 SetControlAlwaysAtBottom(*pLabel, true);
139 AddTouchEventListener(*this);
140 AddOrientationEventListener(*this);
141 __pPresentationModel->AddFileUpdateListener(this);
147 ImageCropForm::OnSceneActivatedN(const SceneId& previousSceneId, const SceneId& currentSceneId, IList* pArgs)
149 AppLogDebug("ENTER pArgs(%x)", pArgs);
152 __sourceFilePath = *(static_cast<String*>(pArgs->GetAt(0)));
153 __cropMode = *(static_cast<String*>(pArgs->GetAt(1)));
154 if (__cropMode == APPCONTROL_DATA_FIT_TO_SCREEN)
156 Integer* pStatus = static_cast<Integer*>(pArgs->GetAt(2));
159 __statusValue = pStatus->ToInt();
161 if (__statusValue == SET_AT_TYPE_CALLER_IMAGE)
163 LongLong* pContentId = static_cast<LongLong*>(pArgs->GetAt(3));
164 if (pContentId != null)
166 __contentId = pContentId->ToLongLong();
173 __sourceFilePath = __pPresentationModel->GetFilePathAt(0);
175 ImageViewerApp* pImageViewerApp = static_cast<ImageViewerApp*>(ImageViewerApp::GetInstance());
176 const IMap* pIMap = pImageViewerApp->GetAppControlArguments();
180 const String* pCropMode = static_cast<const String*>(pIMap->GetValue(String(APPCONTROL_KEY_IMAGE_CROP_MODE)));
182 if (pCropMode != null)
184 __cropMode = *pCropMode;
189 if (__sourceFilePath.IsEmpty() == false)
191 result r = __imageBuffer.Construct(__sourceFilePath.GetPointer());
194 __imageWidth = __imageBuffer.GetWidth();
195 __imageHeight = __imageBuffer.GetHeight();
196 __pCurrentBitmap = __imageBuffer.GetBitmapN(BITMAP_PIXEL_FORMAT_RGB565, BUFFER_SCALING_AUTO);
202 __imageFormat = img.GetImageFormat(__sourceFilePath);
206 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
210 ImageCropForm::OnSceneDeactivated(const SceneId& currentSceneId, const SceneId& nextSceneId)
212 AppLogDebug("ENTER");
213 __pPresentationModel->RemoveFileUpdateListener(*this);
214 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
218 ImageCropForm::OnDraw(void)
220 result r = E_SUCCESS;
221 AppLogDebug("ENTER");
222 if (__pCanvas != null)
224 r = __pCanvas->SetLineWidth(CROP_BOX_LINE_WIDTH);
225 r = __pCanvas->DrawBitmap(Rectangle(__imageBox.x, __imageBox.y, __imageBox.width, __imageBox.height), *__pCurrentBitmap);
226 r = __pCanvas->DrawRectangle(Rectangle(__cropBox.x, __cropBox.y, __cropBox.width, __cropBox.height));
227 r = __pCanvas->DrawBitmap(Rectangle((__cropBox.x + __cropBox.width / 2) - (H_CROP_RECTANGLE / 2), __cropBox.y - (H_CROP_RECTANGLE / 2), H_CROP_RECTANGLE, H_CROP_RECTANGLE), *__pRectangleBitmap); // Top Rectangle
228 r = __pCanvas->DrawBitmap(Rectangle((__cropBox.x + __cropBox.width / 2) - (H_CROP_RECTANGLE / 2), (__cropBox.y + __cropBox.height - (H_CROP_RECTANGLE / 2)), H_CROP_RECTANGLE, H_CROP_RECTANGLE), *__pRectangleBitmap); // Bottom Rectangle
229 r = __pCanvas->DrawBitmap(Rectangle(__cropBox.x - (H_CROP_RECTANGLE / 2), (__cropBox.y + __cropBox.height / 2) - (H_CROP_RECTANGLE / 2), H_CROP_RECTANGLE, H_CROP_RECTANGLE), *__pRectangleBitmap); //Left Rectangle
230 r = __pCanvas->DrawBitmap(Rectangle(__cropBox.x + __cropBox.width - (H_CROP_RECTANGLE / 2), (__cropBox.y + __cropBox.height / 2) - (H_CROP_RECTANGLE / 2), H_CROP_RECTANGLE, H_CROP_RECTANGLE), *__pRectangleBitmap); //Right Rectangle
231 r = __pCanvas->DrawBitmap(Rectangle(__cropBox.x - (H_CROP_RECTANGLE / 2), __cropBox.y - (H_CROP_RECTANGLE / 2), H_CROP_RECTANGLE, H_CROP_RECTANGLE), *__pRectangleBitmap); // Top Left Rectangle
232 r = __pCanvas->DrawBitmap(Rectangle(__cropBox.x + __cropBox.width - (H_CROP_RECTANGLE / 2), __cropBox.y - (H_CROP_RECTANGLE / 2), H_CROP_RECTANGLE, H_CROP_RECTANGLE), *__pRectangleBitmap); // Top Right Rectangle
233 r = __pCanvas->DrawBitmap(Rectangle(__cropBox.x + __cropBox.width - (H_CROP_RECTANGLE / 2), (__cropBox.y + __cropBox.height - (H_CROP_RECTANGLE / 2)), H_CROP_RECTANGLE, H_CROP_RECTANGLE), *__pRectangleBitmap); // Bottom Right Rectangle
234 r = __pCanvas->DrawBitmap(Rectangle(__cropBox.x - (H_CROP_RECTANGLE / 2), (__cropBox.y + __cropBox.height - (H_CROP_RECTANGLE / 2)), H_CROP_RECTANGLE, H_CROP_RECTANGLE), *__pRectangleBitmap); // Bottom Left Rectangle
236 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
241 ImageCropForm::OnActionPerformed(const Tizen::Ui::Control& source, int actionId)
243 SceneManager* pSceneManager = SceneManager::GetInstance();
246 case IDA_BUTTON_CANCEL:
248 ImageViewerApp* pApp = dynamic_cast<ImageViewerApp*>(UiApp::GetInstance());
250 if ( pApp != null && pApp->GetAppControlOperationId() == APPCONTROL_OPERATION_ID_IMAGE_CROP)
252 pApp->SendAppControlResult(APP_CTRL_RESULT_CANCELED, null);
257 pSceneManager->GoBackward(BackwardSceneTransition());
262 case IDA_BUTTON_SAVE:
264 ImageBuffer imageBuffer;
265 result r = imageBuffer.Construct(__sourceFilePath);
269 MessageBox messageBox;
270 messageBox.Construct(L"", ResourceManager::GetString(L"IDS_COM_BODY_UNSUPPORTED_FILE_TYPE"), MSGBOX_STYLE_NONE, 3000);
272 messageBox.ShowAndWait(modalResult);
273 UiApp* pApp = UiApp::GetInstance();
278 if (File::IsFileExist(__sourceFilePath))
280 ImageViewerApp* pApp = dynamic_cast<ImageViewerApp*>(UiApp::GetInstance());
282 if (pApp != null && pApp->GetAppControlOperationId() == APPCONTROL_OPERATION_ID_IMAGE_CROP)
284 ImageBuffer* pCropBuffer = null;
288 destFilePath.Append(App::GetInstance()->GetAppSharedPath());
289 destFilePath.Append(PATH_DATA_DIRECTORY);
290 destFilePath.Append(__pPresentationModel->GetFileName(__sourceFilePath));
291 destFilePath.Reverse();
292 destFilePath.IndexOf(FILE_EXT_SEPARATOR, 0, index);
293 destFilePath.Reverse();
294 destFilePath.Insert(FILE_NAME_SEPARATOR, destFilePath.GetLength() - index - 1);
295 destFilePath.Insert(count, destFilePath.GetLength() - index - 1);
297 while (File::IsFileExist(destFilePath) == true)
300 destFilePath.Clear();
301 destFilePath.Append(App::GetInstance()->GetAppSharedPath());
302 destFilePath.Append(PATH_DATA_DIRECTORY);
303 destFilePath.Append(__pPresentationModel->GetFileName(__sourceFilePath));
304 destFilePath.Insert(FILE_NAME_SEPARATOR, destFilePath.GetLength() - index - 1);
305 destFilePath.Insert(count, destFilePath.GetLength() - index - 1);
307 pCropBuffer = __imageBuffer.CropN(((__cropBox.x - __imageBox.x) * __imageWidth) / __imageBox.width, ((__cropBox.y - __imageBox.y) * __imageHeight) / __imageBox.height,
308 (__cropBox.width * __imageWidth) / __imageBox.width, (__cropBox.height * __imageHeight) / __imageBox.height);
309 pCropBuffer->EncodeToFile(destFilePath, __imageFormat, true, 100);
312 ArrayList* pList = new (std::nothrow) ArrayList(SingleObjectDeleter);
313 pList->Add(new (std::nothrow) String(destFilePath));
315 HashMap* pMap = new (std::nothrow) HashMap(SingleObjectDeleter);
317 pMap->Add(new (std::nothrow) String(APPCONTROL_KEY_SELECTED), pList);
319 pApp->SendAppControlResult(APP_CTRL_RESULT_SUCCEEDED, pMap);
324 ImageBuffer* pCropBuffer = null;
326 if (__cropMode == APPCONTROL_DATA_AUTO)
332 if (__sourceFilePath.IsEmpty() == false)
334 __sourceFilePath.Reverse();
335 __sourceFilePath.IndexOf(FILE_EXT_SEPARATOR, 0, index);
336 __sourceFilePath.Reverse();
337 __sourceFilePath.Insert(FILE_NAME_SEPARATOR, __sourceFilePath.GetLength() - index - 1);
338 destFilePath.Append(__sourceFilePath);
339 destFilePath.Insert(count, destFilePath.GetLength() - index - 1);
340 while (File::IsFileExist(destFilePath) == true)
343 destFilePath.Clear();
344 destFilePath.Append(__sourceFilePath);
345 destFilePath.Insert(count, destFilePath.GetLength() - index - 1);
348 pCropBuffer = __imageBuffer.CropN(((__cropBox.x - __imageBox.x) * __imageWidth) / __imageBox.width, ((__cropBox.y - __imageBox.y) * __imageHeight) / __imageBox.height,
349 (__cropBox.width * __imageWidth) / __imageBox.width, (__cropBox.height * __imageHeight) / __imageBox.height);
350 pCropBuffer->EncodeToFile(destFilePath, __imageFormat, true, 100);
351 ContentManager::ScanFile(destFilePath);
354 ArrayList* pList = new (std::nothrow) ArrayList(SingleObjectDeleter);
355 pList->Add(new (std::nothrow) String(destFilePath));
356 pSceneManager->GoBackward(BackwardSceneTransition(), pList);
358 else if (__cropMode == APPCONTROL_DATA_FIT_TO_SCREEN)
360 result r = E_SUCCESS;
361 pCropBuffer = __imageBuffer.CropN(((__cropBox.x - __imageBox.x) * __imageWidth) / __imageBox.width, ((__cropBox.y - __imageBox.y) * __imageHeight) / __imageBox.height,
362 (__cropBox.width * __imageWidth) / __imageBox.width, (__cropBox.height * __imageHeight) / __imageBox.height);
364 if (__statusValue == SET_AT_TYPE_HOME_SCREEN_WALLPAPER)
366 String destPath = App::GetInstance()->GetAppSharedPath() + PATH_DATA_DIRECTORY + TEMP_FILE_PATH_HOME_SCREEN_WALLPAPER;
367 r = pCropBuffer->EncodeToFile(destPath, IMG_FORMAT_JPG, true, 100);
370 r = SettingInfo::SetValue(SETTING_VALUE_HOME_SCREEN_WALLPAPER, destPath);
373 else if (__statusValue == SET_AT_TYPE_LOCK_SCREEN_WALLPAPER)
375 String destPath = App::GetInstance()->GetAppSharedPath() + PATH_DATA_DIRECTORY + TEMP_FILE_PATH_LOCK_SCREEN_WALLPAPER;
376 r = pCropBuffer->EncodeToFile(destPath, IMG_FORMAT_JPG, true, 100);
379 r = SettingInfo::SetValue(SETTING_VALUE_LOCK_SCREEN_WALLPAPER, destPath);
382 else if (__statusValue == SET_AT_TYPE_HOME_AND_LOCK_SCREEN_WALLPAPER)
384 String destPath = App::GetInstance()->GetAppSharedPath() + PATH_DATA_DIRECTORY + TEMP_FILE_PATH_LOCK_SCREEN_WALLPAPER;
385 String destPathHome = App::GetInstance()->GetAppSharedPath() + PATH_DATA_DIRECTORY + TEMP_FILE_PATH_HOME_SCREEN_WALLPAPER;
386 r = pCropBuffer->EncodeToFile(destPath, IMG_FORMAT_JPG, true, 100);
387 r = pCropBuffer->EncodeToFile(destPathHome, IMG_FORMAT_JPG, true, 100);
390 r = SettingInfo::SetValue(SETTING_VALUE_LOCK_SCREEN_WALLPAPER, destPath);
391 r = SettingInfo::SetValue(SETTING_VALUE_HOME_SCREEN_WALLPAPER, destPathHome);
394 else if (__statusValue == SET_AT_TYPE_CALLER_IMAGE)
398 if (__sourceFilePath.IsEmpty() == false)
400 destFilePath = App::GetInstance()->GetAppSharedPath() + PATH_DATA_DIRECTORY + TEMP_FILE_PATH_CONTACT_IMAGE;
401 r = pCropBuffer->EncodeToFile(destFilePath, IMG_FORMAT_JPG, true, 100);
402 Contact* pContact = null;
403 AddressbookManager* pAddressbookManager = AddressbookManager::GetInstance();
404 Addressbook* pAddressbook = null;
406 pAddressbook = pAddressbookManager->GetAddressbookN(DEFAULT_ADDRESSBOOK_ID);
407 if (pAddressbook != null)
409 pContact = pAddressbook->GetContactN(__contentId);
410 if (pContact != null)
412 pContact->SetThumbnail(destFilePath);
413 pAddressbook->UpdateContact(*pContact);
421 pSceneManager->GoBackward(BackwardSceneTransition());
427 MessageBox messageBox;
428 messageBox.Construct(L"", ResourceManager::GetString(L"IDS_IV_POP_INVALID_IMAGE_FILE"), MSGBOX_STYLE_NONE, 3000);
430 messageBox.ShowAndWait(modalResult);
431 UiApp* pApp = UiApp::GetInstance();
438 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
442 ImageCropForm::OnOrientationChanged(const Control &source, OrientationStatus orientationStatus)
444 AppLogDebug("ENTER");
445 __isOrientationChanged = true;
448 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
452 ImageCropForm::OnTouchPressed(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo)
454 AppLogDebug("ENTER");
455 __touchStart = currentPosition;
456 CheckCurrentPosition(currentPosition);
457 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
461 ImageCropForm::OnTouchMoved(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo)
463 AppLogDebug("ENTER");
464 int deltaX = currentPosition.x - __touchStart.x;
465 int deltaY = currentPosition.y - __touchStart.y;
466 if (__cropMode.Equals(APPCONTROL_DATA_AUTO, false))
468 switch(__pointLocation)
470 case INSIDE_TOP_RECTANGLE:
472 if ((__cropBox.y + deltaY) > __imageBox.y && deltaY < (__cropBox.height - (H_CROP_RECTANGLE * 3)))
474 __cropBox.y += deltaY;
475 __cropBox.height -= deltaY;
480 case INSIDE_BOTTOM_RECTANGLE:
482 if ((__cropBox.y + __cropBox.height + deltaY) < (__imageBox.y + __imageBox.height)
483 && (__cropBox.height + deltaY) > (H_CROP_RECTANGLE * 3))
485 __cropBox.height += deltaY;
490 case INSIDE_LEFT_RECTANGLE:
492 if ((__cropBox.x + deltaX) > __imageBox.x && deltaX < __cropBox.width - (H_CROP_RECTANGLE * 3))
494 __cropBox.x += deltaX;
495 __cropBox.width -= deltaX;
500 case INSIDE_RIGHT_RECTANGLE:
502 if ((__cropBox.x + __cropBox.width + deltaX) < (__imageBox.x + __imageBox.width)
503 && __cropBox.width + deltaX > (H_CROP_RECTANGLE * 3))
505 __cropBox.width += deltaX;
510 case INSIDE_TOP_LEFT_RECTANGLE:
512 if ((__cropBox.y + deltaY) > __imageBox.y && deltaY < (__cropBox.height - (H_CROP_RECTANGLE * 3))
513 && (__cropBox.x + deltaX) > __imageBox.x && deltaX < __cropBox.width - (H_CROP_RECTANGLE * 3))
515 __cropBox.y += deltaY;
516 __cropBox.height -= deltaY;
517 __cropBox.x += deltaX;
518 __cropBox.width -= deltaX;
523 case INSIDE_TOP_RIGHT_RECTANGLE:
525 if ((__cropBox.y + deltaY) > __imageBox.y && deltaY < (__cropBox.height - (H_CROP_RECTANGLE * 3))
526 && (__cropBox.x + __cropBox.width + deltaX) < (__imageBox.x + __imageBox.width) && __cropBox.width + deltaX > (H_CROP_RECTANGLE * 3))
528 __cropBox.width += deltaX;
529 __cropBox.y += deltaY;
530 __cropBox.height -= deltaY;
535 case INSIDE_BOTTOM_LEFT_RECTANGLE:
537 if ((__cropBox.y + __cropBox.height + deltaY) < (__imageBox.y + __imageBox.height) && (__cropBox.height + deltaY) > (H_CROP_RECTANGLE * 3)
538 && (__cropBox.x + deltaX) > __imageBox.x && deltaX < __cropBox.width - (H_CROP_RECTANGLE * 3))
540 __cropBox.x += deltaX;
541 __cropBox.width -= deltaX;
542 __cropBox.height += deltaY;
547 case INSIDE_BOTTOM_RIGHT_RECTANGLE:
549 if ((__cropBox.x + __cropBox.width + deltaX) < (__imageBox.x + __imageBox.width) && __cropBox.width + deltaX > (H_CROP_RECTANGLE * 3)
550 && (__cropBox.y + __cropBox.height + deltaY) < (__imageBox.y + __imageBox.height) && (__cropBox.height + deltaY) > (H_CROP_RECTANGLE * 3))
552 __cropBox.width += deltaX;
553 __cropBox.height += deltaY;
560 if ((__cropBox.x + deltaX) > __imageBox.x)
562 __cropBox.x += deltaX;
566 __cropBox.x = __imageBox.x;
568 if ((__cropBox.y + deltaY) > __imageBox.y)
570 __cropBox.y += deltaY;
574 __cropBox.y = __imageBox.y;
576 if ((__cropBox.x + __cropBox.width + deltaX) > (__imageBox.x + __imageBox.width))
578 __cropBox.x = __imageBox.x + __imageBox.width - __cropBox.width;
580 if ((__cropBox.y + __cropBox.height + deltaY) > (__imageBox.y + __imageBox.height))
582 __cropBox.y = __imageBox.y + __imageBox.height - __cropBox.height;
591 else if (__cropMode.Equals(APPCONTROL_DATA_FIT_TO_SCREEN, false))
593 if (__pointLocation == INSIDE_LEFT_RECTANGLE || __pointLocation == INSIDE_BOTTOM_LEFT_RECTANGLE
594 || __pointLocation == INSIDE_TOP_LEFT_RECTANGLE)
596 int temp = __cropBox.height;
597 int height = (__formHeight * (__cropBox.width - (2 * deltaX))) /__formWidth;
598 temp = height - temp;
599 if ((__cropBox.width - (2 * deltaX) > (H_CROP_RECTANGLE * 3)) && (!(height >= __imageBox.height || (__cropBox.width - (2 * deltaX)) >= __imageBox.width)))
601 if (__cropBox.x + deltaX >= __imageBox.x && __cropBox.x + __cropBox.width - deltaX <= __imageBox.x + __imageBox.width
602 && __cropBox.y - (temp / 2) >= __imageBox.y && __cropBox.y + __cropBox.height + (temp / 2) < __imageBox.y + __imageBox.height
603 && (__cropBox.width - (2 * deltaX) > (H_CROP_RECTANGLE * 3)))
605 __cropBox.x += deltaX;
606 __cropBox.width = __cropBox.width - (2 * deltaX);
607 __cropBox.height = height;
608 __cropBox.y = __cropBox.y - (temp / 2);
610 else if ((__cropBox.y + __cropBox.height) <= (__imageBox.y + __imageBox.height)
611 && __cropBox.width < __imageBox.width
612 && __cropBox.x + deltaX >= __imageBox.x && __cropBox.y - temp >= __imageBox.y )
614 if (__cropBox.x + __cropBox.width - deltaX <= __imageBox.x + __imageBox.width
615 && __cropBox.x + deltaX >= __imageBox.x)
617 __cropBox.x += deltaX;
621 __cropBox.x = __cropBox.x + (2 * deltaX);
623 __cropBox.width = __cropBox.width - (2 * deltaX);
624 __cropBox.height = height;
625 __cropBox.y = __cropBox.y - temp;
627 else if (__cropBox.y - (temp / 2) <= __imageBox.y && __cropBox.width - (deltaX) <= __imageBox.width
628 && __cropBox.x + deltaX >= __imageBox.x && __cropBox.y + __cropBox.height + temp <= __imageBox.y + __imageBox.height)
630 if (__cropBox.x + __cropBox.width - deltaX <= __imageBox.x + __imageBox.width)
632 __cropBox.x += deltaX;
636 __cropBox.x = __cropBox.x + (2 * deltaX);
638 __cropBox.width = __cropBox.width - (2 * deltaX);
639 __cropBox.height = height;
643 else if (__pointLocation == INSIDE_RIGHT_RECTANGLE || __pointLocation == INSIDE_BOTTOM_RIGHT_RECTANGLE
644 || __pointLocation == INSIDE_TOP_RIGHT_RECTANGLE)
648 int temp = __cropBox.height;
649 int height = (__formHeight * (__cropBox.width - (2 * deltaX))) / __formWidth;
650 temp = height - temp;
651 if ((__cropBox.width - (2 * deltaX) > (H_CROP_RECTANGLE * 3)) && (!(height >= __imageBox.height || (__cropBox.width - (2 * deltaX)) >= __imageBox.width)))
653 if (deltaX < __cropBox.width - (H_CROP_RECTANGLE * 3))
655 if (__cropBox.x + deltaX > __imageBox.x && __cropBox.x + __cropBox.width - deltaX <= __imageBox.x + __imageBox.width
656 && __cropBox.y - (temp / 2) > __imageBox.y && __cropBox.y + __cropBox.height + (temp / 2) < __imageBox.y + __imageBox.height)
658 __cropBox.x += deltaX;
659 __cropBox.width = __cropBox.width - (2 * deltaX);;
660 __cropBox.height = height;
661 __cropBox.y = __cropBox.y - (temp / 2);
663 else if ((__cropBox.y + __cropBox.height + (temp / 2)) >= (__imageBox.y + __imageBox.height)
664 && __cropBox.x + __cropBox.width - (2 * deltaX) <= __imageBox.x + __imageBox.width
665 && __cropBox.x - deltaX >= __imageBox.x && __cropBox.y - temp >= __imageBox.y )
667 if (__cropBox.x + __cropBox.width - deltaX <= __imageBox.x + __imageBox.width
668 && __cropBox.x + deltaX >= __imageBox.x)
670 __cropBox.x += deltaX;
674 __cropBox.width = __cropBox.width - (2 * deltaX);
676 __cropBox.width = __cropBox.width - (2 * deltaX);
677 __cropBox.height = height;
678 __cropBox.y = __cropBox.y - temp;
680 else if (__cropBox.y - (temp / 2) <= __imageBox.y && __cropBox.width - (deltaX) <= __imageBox.width
681 && __cropBox.x + deltaX <= __imageBox.x && __cropBox.y + __cropBox.height + temp <= __imageBox.y + __imageBox.height)
683 if (__cropBox.x + deltaX >= __imageBox.x)
685 __cropBox.x += deltaX;
689 __cropBox.x = __imageBox.x;
691 __cropBox.width = __cropBox.width - (2 * deltaX);
692 __cropBox.height = height;
694 else if (__cropBox.y - (temp / 2) <= __imageBox.y && __cropBox.x + deltaX >= __imageBox.x
695 && __cropBox.x + __cropBox.width - deltaX <= __imageBox.x + __imageBox.width
696 && __cropBox.y + __cropBox.height + temp <= __imageBox.y + __imageBox.height)
698 __cropBox.x += deltaX;
699 __cropBox.width = __cropBox.width - (2 * deltaX);
700 __cropBox.height = height;
702 else if (__cropBox.x + deltaX <= __imageBox.x && __cropBox.y - (temp / 2) >= __imageBox.y
703 && __cropBox.x + __cropBox.width - deltaX <= __imageBox.x + __imageBox.width
704 && __cropBox.y + __cropBox.height + temp <= __imageBox.y + __imageBox.height)
706 __cropBox.width = __cropBox.width - (2 * deltaX);
707 __cropBox.y = __cropBox.y - (temp / 2);
708 __cropBox.height = height;
713 else if (__pointLocation == INSIDE_TOP_RECTANGLE)
715 int temp = __cropBox.width;
716 int width = (__formWidth * (__cropBox.height - (2 * deltaY))) / __formHeight;
718 if (__cropBox.height - (2 * deltaY) > (__formHeight * (H_CROP_RECTANGLE * 3)) / __formWidth && (!(__cropBox.height - (2 * deltaY) >= __imageBox.height || width >= __imageBox.width)))
720 if (__cropBox.x - (temp /2 ) > __imageBox.x && __cropBox.x + __cropBox.width + temp < __imageBox.x + __imageBox.width
721 && __cropBox.y + (deltaY) > __imageBox.y && __cropBox.y + __cropBox.height - (2 * deltaY) < __imageBox.y + __imageBox.height)
723 __cropBox.y += deltaY;
724 __cropBox.height = __cropBox.height - (2 * deltaY);
725 __cropBox.width = width;
726 __cropBox.x = __cropBox.x - (temp / 2);
728 else if (__cropBox.x - (temp / 2) < __imageBox.x)
730 if (__cropBox.x + __cropBox.width + temp <= __imageBox.x + __imageBox.width)
732 __cropBox.width = width;
734 if (__cropBox.y + deltaY >= __imageBox.y)
736 __cropBox.y += deltaY;
738 if (__cropBox.y + __cropBox.height - (2 * deltaY) < __imageBox.y + __imageBox.height)
740 __cropBox.height = __cropBox.height - (2 * deltaY);
743 else if (__cropBox.y + __cropBox.height - (2 * deltaY) >= __imageBox.x + __imageBox.height
744 && __cropBox.y + (2 * deltaY) >= __imageBox.y)
746 if (__cropBox.x - temp >= __imageBox.x
747 && __cropBox.x + __cropBox.width + temp > __imageBox.x + __imageBox.width)
749 __cropBox.x = __cropBox.x - temp;
751 else if (__cropBox.x - temp >= __imageBox.x)
753 __cropBox.x = __cropBox.x - temp / 2;
755 if (__cropBox.x + __cropBox.width + temp <= __imageBox.x + __imageBox.width)
757 __cropBox.width = width;
759 if (__cropBox.y + (2 * deltaY) >= __imageBox.y)
761 __cropBox.y = __cropBox.y + (2 * deltaY);
762 __cropBox.height = __cropBox.height - (2 * deltaY);
765 else if (__cropBox.x + __cropBox.width + (temp / 2) > __imageBox.x + __imageBox.width
766 && __cropBox.x - temp >= __imageBox.x && __cropBox.y + deltaY >= __imageBox.y
767 && __cropBox.y + __cropBox.height - (2 * deltaY) <= __imageBox.y + __imageBox.height)
769 __cropBox.x = __cropBox.x - temp;
770 __cropBox.width = width;
771 __cropBox.y += deltaY;
772 __cropBox.height = __cropBox.height - (2 * deltaY);
776 else if (__pointLocation == INSIDE_BOTTOM_RECTANGLE)
778 deltaY = deltaY * (-1);
779 int temp = __cropBox.width;
780 int width = (__formWidth * (__cropBox.height - (2 * deltaY))) / __formHeight;
782 if (__cropBox.height - (2 * deltaY) > (__formHeight * (H_CROP_RECTANGLE * 3)) / __formWidth && (!(__cropBox.height - (2 * deltaY) >= __imageBox.height || width >= __imageBox.width)))
784 if (__cropBox.x - (temp / 2) >= __imageBox.x && __cropBox.x + __cropBox.width + temp < __imageBox.x + __imageBox.width
785 && __cropBox.y + deltaY > __imageBox.y && __cropBox.y + __cropBox.height - (2 * deltaY) < __imageBox.y + __imageBox.height)
787 __cropBox.y += deltaY;
788 __cropBox.height = __cropBox.height - (2 * deltaY);;
789 __cropBox.width = width;
790 __cropBox.x = __cropBox.x - (temp / 2);
792 else if (__cropBox.y + deltaY < __imageBox.y && __cropBox.y + __cropBox.height - (2 * deltaY) < __imageBox.y + __imageBox.height
793 && __cropBox.x - (temp / 2) > __imageBox.x && __cropBox.x + __cropBox.width + temp < __imageBox.x + __imageBox.width)
795 __cropBox.x = __cropBox.x - (temp / 2);
796 __cropBox.width = width;
797 __cropBox.height = __cropBox.height - (2 * deltaY);
799 else if (__cropBox.x + __cropBox.width + temp > __imageBox.x + __imageBox.width
800 && __cropBox.y + deltaY >= __imageBox.y && __cropBox.y + __cropBox.height + temp <= __imageBox.y + __imageBox.height
801 && __cropBox.x - temp >= __imageBox.x)
803 __cropBox.x = __cropBox.x - temp;
804 __cropBox.y += deltaY;
805 __cropBox.width = width;
806 __cropBox.height = __cropBox.height - (2 * deltaY);
808 else if (__cropBox.x + __cropBox.width + temp >= __imageBox.x + __imageBox.width
809 && __cropBox.y + deltaY <= __imageBox.y && __cropBox.x - temp > __imageBox.x
810 && __cropBox.y + __cropBox.height + temp < __imageBox.y + __imageBox.height)
813 __cropBox.width = width;
814 __cropBox.height = __cropBox.height - (2 * deltaY);
816 else if (__cropBox.x - temp < __imageBox.x && __cropBox.x + __cropBox.width + temp <= __imageBox.x + __imageBox.width
817 && __cropBox.y + __cropBox.height - (2 * deltaY) <= __imageBox.y + __imageBox.height)
819 if (__cropBox.y + deltaY >= __imageBox.y)
821 __cropBox.y += deltaY;
823 __cropBox.width = width;
824 __cropBox.height = __cropBox.height - (2 * deltaY);
828 else if (__pointLocation == INSIDE_CROPBOX)
830 if ((__cropBox.x + deltaX) > __imageBox.x)
832 __cropBox.x += deltaX;
836 __cropBox.x = __imageBox.x;
838 if ((__cropBox.y + deltaY) > __imageBox.y)
840 __cropBox.y += deltaY;
844 __cropBox.y = __imageBox.y;
846 if ((__cropBox.x + __cropBox.width + deltaX) > (__imageBox.x + __imageBox.width))
848 __cropBox.x = __imageBox.x + __imageBox.width - __cropBox.width;
850 if ((__cropBox.y + __cropBox.height + deltaY) > (__imageBox.y + __imageBox.height))
852 __cropBox.y = __imageBox.y + __imageBox.height - __cropBox.height;
856 RequestRedraw(false);
857 __touchStart = currentPosition;
858 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
862 ImageCropForm::OnTouchReleased(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo)
864 AppLogDebug("ENTER");
865 __pointLocation = OUTSIDE_CROPBOX;
866 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
870 ImageCropForm::CheckCurrentPosition(const Point currentPosition)
872 AppLogDebug("ENTER");
873 if (currentPosition.x > ((__cropBox.x + __cropBox.width / 2) - (H_CROP_RECTANGLE / 2) - CROP_BOX_OFFSET) && currentPosition.x < ((__cropBox.x + __cropBox.width / 2) + (H_CROP_RECTANGLE / 2) + CROP_BOX_OFFSET)
874 && currentPosition.y > (__cropBox.y - (H_CROP_RECTANGLE / 2) - CROP_BOX_OFFSET) && currentPosition.y < (__cropBox.y + (H_CROP_RECTANGLE / 2) + CROP_BOX_OFFSET))
876 __pointLocation = INSIDE_TOP_RECTANGLE;
878 else if (currentPosition.x > (__cropBox.x - (H_CROP_RECTANGLE / 2) - CROP_BOX_OFFSET) && currentPosition.x < (__cropBox.x + (H_CROP_RECTANGLE / 2) + CROP_BOX_OFFSET)
879 && currentPosition.y > ((__cropBox.y + __cropBox.height / 2) - (H_CROP_RECTANGLE / 2) - CROP_BOX_OFFSET) && currentPosition.y < ((__cropBox.y + __cropBox.height / 2) + (H_CROP_RECTANGLE / 2) + CROP_BOX_OFFSET))
881 __pointLocation = INSIDE_LEFT_RECTANGLE;
883 else if (currentPosition.x > (__cropBox.x + __cropBox.width - (H_CROP_RECTANGLE / 2) - CROP_BOX_OFFSET) && currentPosition.x < (__cropBox.x + __cropBox.width + (H_CROP_RECTANGLE / 2) + CROP_BOX_OFFSET)
884 && currentPosition.y > ((__cropBox.y + __cropBox.height / 2) - (H_CROP_RECTANGLE / 2) - CROP_BOX_OFFSET) && currentPosition.y < ((__cropBox.y + __cropBox.height / 2) + (H_CROP_RECTANGLE / 2) + CROP_BOX_OFFSET))
886 __pointLocation = INSIDE_RIGHT_RECTANGLE;
888 else if (currentPosition.x > ((__cropBox.x + __cropBox.width / 2) - (H_CROP_RECTANGLE / 2) - CROP_BOX_OFFSET) && currentPosition.x < ((__cropBox.x + __cropBox.width / 2) + (H_CROP_RECTANGLE / 2) + CROP_BOX_OFFSET)
889 && currentPosition.y > (__cropBox.y + __cropBox.height - (H_CROP_RECTANGLE / 2) - CROP_BOX_OFFSET) && currentPosition.y < (__cropBox.y + __cropBox.height + (H_CROP_RECTANGLE / 2) + CROP_BOX_OFFSET))
891 __pointLocation = INSIDE_BOTTOM_RECTANGLE;
893 else if (currentPosition.x > (__cropBox.x - (H_CROP_RECTANGLE / 2) - CROP_BOX_OFFSET) && currentPosition.x < (__cropBox.x + (H_CROP_RECTANGLE / 2) + CROP_BOX_OFFSET)
894 && currentPosition.y > (__cropBox.y - (H_CROP_RECTANGLE / 2) - CROP_BOX_OFFSET) && currentPosition.y < (__cropBox.y +(H_CROP_RECTANGLE / 2) + CROP_BOX_OFFSET))
896 __pointLocation = INSIDE_TOP_LEFT_RECTANGLE;
898 else if (currentPosition.x > ((__cropBox.x + __cropBox.width / 2) - (H_CROP_RECTANGLE / 2) - CROP_BOX_OFFSET) && currentPosition.x < (__cropBox.x + __cropBox.width + (H_CROP_RECTANGLE / 2) + CROP_BOX_OFFSET)
899 && currentPosition.y > (__cropBox.y - (H_CROP_RECTANGLE / 2) - CROP_BOX_OFFSET) && currentPosition.y < (__cropBox.y +(H_CROP_RECTANGLE / 2) + CROP_BOX_OFFSET))
901 __pointLocation = INSIDE_TOP_RIGHT_RECTANGLE;
903 else if (currentPosition.x > (__cropBox.x + __cropBox.width - (H_CROP_RECTANGLE / 2) - CROP_BOX_OFFSET) && currentPosition.x < (__cropBox.x + __cropBox.width + (H_CROP_RECTANGLE / 2) + CROP_BOX_OFFSET)
904 && currentPosition.y > (__cropBox.y + __cropBox.height - (H_CROP_RECTANGLE / 2) - CROP_BOX_OFFSET) && currentPosition.y < (__cropBox.y + __cropBox.height + (H_CROP_RECTANGLE / 2) + CROP_BOX_OFFSET))
906 __pointLocation = INSIDE_BOTTOM_RIGHT_RECTANGLE;
908 else if (currentPosition.x > (__cropBox.x - (H_CROP_RECTANGLE / 2) - CROP_BOX_OFFSET) && currentPosition.x < (__cropBox.x + (H_CROP_RECTANGLE / 2) + CROP_BOX_OFFSET)
909 && currentPosition.y > (__cropBox.y + __cropBox.height - (H_CROP_RECTANGLE / 2) - CROP_BOX_OFFSET) && currentPosition.y < (__cropBox.y + __cropBox.height + (H_CROP_RECTANGLE / 2) + CROP_BOX_OFFSET))
911 __pointLocation = INSIDE_BOTTOM_LEFT_RECTANGLE;
913 else if (currentPosition.x > __cropBox.x && currentPosition.x < (__cropBox.x + __cropBox.width) && currentPosition.y > __cropBox.y && currentPosition.y < (__cropBox.y + __cropBox.height))
915 __pointLocation = INSIDE_CROPBOX;
919 __pointLocation = OUTSIDE_CROPBOX;
921 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
926 ImageCropForm::SetValue(void)
928 int prevHeight = __imageBox.height;
929 int prevWidth = __imageBox.width;
930 int prevImageboxX = __imageBox.x;
931 int prevImageBoxY = __imageBox.y;
932 Panel* pPanel = null;
933 pPanel = static_cast<Panel*>(GetControl(L"IDC_FOOTER_PANEL"));
935 if (GetOrientationStatus() == ORIENTATION_STATUS_PORTRAIT)
937 __formHeight = Form::GetBounds().height;
938 __formWidth = Form::GetBounds().width;
940 else if (GetOrientationStatus() == ORIENTATION_STATUS_LANDSCAPE || GetOrientationStatus() == ORIENTATION_STATUS_LANDSCAPE_REVERSE)
942 __formHeight = Form::GetBounds().width;
943 __formWidth = Form::GetBounds().height;
946 float clientAreaRatio = (GetClientAreaBoundsF().height - pPanel->GetBounds().height) / GetClientAreaBoundsF().width;
948 if (__imageWidth >= GetClientAreaBounds().width || __imageHeight > (GetClientAreaBounds().height - pPanel->GetBounds().height))
950 float imageRatio = __imageHeight / (float) __imageWidth;
951 if (imageRatio < clientAreaRatio)
953 __imageBox.width = GetClientAreaBounds().width;
954 __imageBox.height = (__imageHeight * __imageBox.width) / __imageWidth;
955 __imageBox.x = GetClientAreaBounds().x;
956 __imageBox.y = GetClientAreaBounds().y + ((GetClientAreaBounds().height - pPanel->GetBounds().height) - __imageBox.height) / 2;
960 __imageBox.height = GetClientAreaBounds().height - pPanel->GetBounds().height;
961 __imageBox.width = (__imageWidth * __imageBox.height) / __imageHeight;
962 __imageBox.x = (GetClientAreaBounds().width - __imageBox.width) / 2;
963 __imageBox.y = GetClientAreaBounds().y;
968 __imageBox.height = __imageHeight;
969 __imageBox.width = __imageWidth;
970 __imageBox.x = (GetClientAreaBounds().width - __imageBox.width) / 2;
971 __imageBox.y = (GetClientAreaBounds().height - __imageBox.height) / 2 ;
973 if (__isOrientationChanged == false)
975 if (__imageBox.height > __imageBox.width)
977 __cropBox.width = (2 * __imageBox.width) / 3;
978 __cropBox.height = (__formHeight * __cropBox.width / __formWidth);
979 if (__cropBox.height > __imageBox.height)
981 __cropBox.height = (2 * __imageBox.height) / 3;
982 __cropBox.width = (__cropBox.height * __formWidth) / __formHeight;
984 __cropBox.y = __imageBox.y + (__imageBox.height - __cropBox.height) / 2;
985 __cropBox.x = __imageBox.x + (__imageBox.width - __cropBox.width) / 2;
989 __cropBox.height = (2 *__imageBox.height) / 3;
990 __cropBox.width = (__formWidth * __cropBox.height / __formHeight);
991 if (__cropBox.width > __imageBox.width)
993 __cropBox.width = (2 * __imageBox.width) / 3;
994 __cropBox.height = (__formHeight * __cropBox.width) / __formWidth;
996 __cropBox.y = __imageBox.y + (__imageBox.height - __cropBox.height) / 2;
997 __cropBox.x = __imageBox.x + (__imageBox.width - __cropBox.width) / 2;
1002 float temp = __imageBox.x + ((__cropBox.x - prevImageboxX) * __imageBox.width) / (float) prevWidth;
1003 __cropBox.x = (temp + 0.5);
1004 temp = __imageBox.y + ((__cropBox.y - prevImageBoxY) * __imageBox.height) / (float) prevHeight;
1005 __cropBox.y = (temp + 0.5);
1006 temp = (__cropBox.height * __imageBox.height) / (float) prevHeight;
1007 __cropBox.height = (temp + 0.5);
1008 temp = (__cropBox.width * __imageBox.width) / (float) prevWidth;
1009 __cropBox.width = (temp + 0.5);
1011 __pCanvas = GetCanvasN();
1012 __pCanvas->SetForegroundColor(CROP_BOX_RECTANGLE_COLOR);
1016 ImageCropForm::OnFormFileEventOccuered(const int index, const unsigned long eventId)
1018 AppLogDebug(" ENTER");
1019 UiApp::GetInstance()->Terminate();
1020 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));