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);
153 __sourceFilePath = *(static_cast<String*>(pArgs->GetAt(0)));
154 __cropMode = *(static_cast<String*>(pArgs->GetAt(1)));
155 if (__cropMode == APPCONTROL_DATA_FIT_TO_SCREEN)
157 Integer* pStatus = static_cast<Integer*>(pArgs->GetAt(2));
160 __statusValue = pStatus->ToInt();
162 if (__statusValue == SET_AT_TYPE_CALLER_IMAGE)
164 LongLong* pContentId = static_cast<LongLong*>(pArgs->GetAt(3));
165 if (pContentId != null)
167 __contentId = pContentId->ToLongLong();
174 __sourceFilePath = __pPresentationModel->GetFilePathAt(0);
176 ImageViewerApp* pImageViewerApp = static_cast<ImageViewerApp*>(ImageViewerApp::GetInstance());
177 const IMap* pIMap = pImageViewerApp->GetAppControlArguments();
181 const String* pCropMode = static_cast<const String*>(pIMap->GetValue(String(APPCONTROL_KEY_IMAGE_CROP_MODE)));
183 if (pCropMode != null)
185 __cropMode = *pCropMode;
190 if (__sourceFilePath.IsEmpty() == false)
192 result r = __imageBuffer.Construct(__sourceFilePath.GetPointer());
195 __imageWidth = __imageBuffer.GetWidth();
196 __imageHeight = __imageBuffer.GetHeight();
197 __pCurrentBitmap = __imageBuffer.GetBitmapN(BITMAP_PIXEL_FORMAT_RGB565, BUFFER_SCALING_AUTO);
203 __imageFormat = img.GetImageFormat(__sourceFilePath);
207 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
211 ImageCropForm::OnSceneDeactivated(const SceneId& currentSceneId, const SceneId& nextSceneId)
213 AppLogDebug("ENTER");
214 __pPresentationModel->RemoveFileUpdateListener(*this);
215 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
219 ImageCropForm::OnDraw(void)
221 result r = E_SUCCESS;
222 AppLogDebug("ENTER");
223 if (__pCanvas != null)
225 r = __pCanvas->SetLineWidth(CROP_BOX_LINE_WIDTH);
226 r = __pCanvas->DrawBitmap(Rectangle(__imageBox.x, __imageBox.y, __imageBox.width, __imageBox.height), *__pCurrentBitmap);
227 r = __pCanvas->DrawRectangle(Rectangle(__cropBox.x, __cropBox.y, __cropBox.width, __cropBox.height));
228 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
229 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
230 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
231 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
232 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
233 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
234 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
235 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
237 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
242 ImageCropForm::OnActionPerformed(const Tizen::Ui::Control& source, int actionId)
244 SceneManager* pSceneManager = SceneManager::GetInstance();
247 case IDA_BUTTON_CANCEL:
249 ImageViewerApp* pApp = dynamic_cast<ImageViewerApp*>(UiApp::GetInstance());
251 if ( pApp != null && pApp->GetAppControlOperationId() == APPCONTROL_OPERATION_ID_IMAGE_CROP)
253 pApp->SendAppControlResult(APP_CTRL_RESULT_CANCELED, null);
258 pSceneManager->GoBackward(BackwardSceneTransition());
263 case IDA_BUTTON_SAVE:
265 ImageBuffer imageBuffer;
266 result r = imageBuffer.Construct(__sourceFilePath);
270 MessageBox messageBox;
271 messageBox.Construct(L"", ResourceManager::GetString(L"IDS_COM_BODY_UNSUPPORTED_FILE_TYPE"), MSGBOX_STYLE_NONE, 3000);
273 messageBox.ShowAndWait(modalResult);
274 UiApp* pApp = UiApp::GetInstance();
279 if (File::IsFileExist(__sourceFilePath))
281 ImageViewerApp* pApp = dynamic_cast<ImageViewerApp*>(UiApp::GetInstance());
283 if (pApp != null && pApp->GetAppControlOperationId() == APPCONTROL_OPERATION_ID_IMAGE_CROP)
285 ImageBuffer* pCropBuffer = null;
289 destFilePath.Append(App::GetInstance()->GetAppDataPath());
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()->GetAppDataPath());
302 destFilePath.Append(__pPresentationModel->GetFileName(__sourceFilePath));
303 destFilePath.Insert(FILE_NAME_SEPARATOR, destFilePath.GetLength() - index - 1);
304 destFilePath.Insert(count, destFilePath.GetLength() - index - 1);
306 pCropBuffer = __imageBuffer.CropN(((__cropBox.x - __imageBox.x) * __imageWidth) / __imageBox.width, ((__cropBox.y - __imageBox.y) * __imageHeight) / __imageBox.height,
307 (__cropBox.width * __imageWidth) / __imageBox.width, (__cropBox.height * __imageHeight) / __imageBox.height);
308 pCropBuffer->EncodeToFile(destFilePath, __imageFormat, true, 100);
311 ArrayList* pList = new (std::nothrow) ArrayList(SingleObjectDeleter);
312 pList->Add(new (std::nothrow) String(destFilePath));
314 HashMap* pMap = new (std::nothrow) HashMap(SingleObjectDeleter);
316 pMap->Add(new (std::nothrow) String(APPCONTROL_KEY_SELECTED), pList);
318 pApp->SendAppControlResult(APP_CTRL_RESULT_SUCCEEDED, pMap);
323 ImageBuffer* pCropBuffer = null;
325 if (__cropMode == APPCONTROL_DATA_AUTO)
331 if (__sourceFilePath.IsEmpty() == false)
333 __sourceFilePath.Reverse();
334 __sourceFilePath.IndexOf(FILE_EXT_SEPARATOR, 0, index);
335 __sourceFilePath.Reverse();
336 __sourceFilePath.Insert(FILE_NAME_SEPARATOR, __sourceFilePath.GetLength() - index - 1);
337 destFilePath.Append(__sourceFilePath);
338 destFilePath.Insert(count, destFilePath.GetLength() - index - 1);
339 while (File::IsFileExist(destFilePath) == true)
342 destFilePath.Clear();
343 destFilePath.Append(__sourceFilePath);
344 destFilePath.Insert(count, destFilePath.GetLength() - index - 1);
347 pCropBuffer = __imageBuffer.CropN(((__cropBox.x - __imageBox.x) * __imageWidth) / __imageBox.width, ((__cropBox.y - __imageBox.y) * __imageHeight) / __imageBox.height,
348 (__cropBox.width * __imageWidth) / __imageBox.width, (__cropBox.height * __imageHeight) / __imageBox.height);
349 pCropBuffer->EncodeToFile(destFilePath, __imageFormat, true, 100);
350 ContentManager::ScanFile(destFilePath);
353 ArrayList* pList = new (std::nothrow) ArrayList(SingleObjectDeleter);
354 pList->Add(new (std::nothrow) String(destFilePath));
355 pSceneManager->GoBackward(BackwardSceneTransition(), pList);
357 else if (__cropMode == APPCONTROL_DATA_FIT_TO_SCREEN)
359 result r = E_SUCCESS;
360 pCropBuffer = __imageBuffer.CropN(((__cropBox.x - __imageBox.x) * __imageWidth) / __imageBox.width, ((__cropBox.y - __imageBox.y) * __imageHeight) / __imageBox.height,
361 (__cropBox.width * __imageWidth) / __imageBox.width, (__cropBox.height * __imageHeight) / __imageBox.height);
363 if (__statusValue == SET_AT_TYPE_HOME_SCREEN_WALLPAPER)
365 String destPath = App::GetInstance()->GetAppDataPath() + TEMP_FILE_PATH_HOME_SCREEN_WALLPAPER;
366 r = pCropBuffer->EncodeToFile(destPath, IMG_FORMAT_JPG, true, 100);
369 r = SettingInfo::SetValue(SETTING_VALUE_HOME_SCREEN_WALLPAPER, destPath);
372 else if (__statusValue == SET_AT_TYPE_LOCK_SCREEN_WALLPAPER)
374 String destPath = App::GetInstance()->GetAppDataPath() + TEMP_FILE_PATH_LOCK_SCREEN_WALLPAPER;
375 r = pCropBuffer->EncodeToFile(destPath, IMG_FORMAT_JPG, true, 100);
378 r = SettingInfo::SetValue(SETTING_VALUE_LOCK_SCREEN_WALLPAPER, destPath);
381 else if (__statusValue == SET_AT_TYPE_HOME_AND_LOCK_SCREEN_WALLPAPER)
383 String destPath = App::GetInstance()->GetAppDataPath() + TEMP_FILE_PATH_LOCK_SCREEN_WALLPAPER;
384 String destPathHome = App::GetInstance()->GetAppDataPath() + TEMP_FILE_PATH_HOME_SCREEN_WALLPAPER;
385 r = pCropBuffer->EncodeToFile(destPath, IMG_FORMAT_JPG, true, 100);
386 r = pCropBuffer->EncodeToFile(destPathHome, IMG_FORMAT_JPG, true, 100);
389 r = SettingInfo::SetValue(SETTING_VALUE_LOCK_SCREEN_WALLPAPER, destPath);
390 r = SettingInfo::SetValue(SETTING_VALUE_HOME_SCREEN_WALLPAPER, destPathHome);
393 else if (__statusValue == SET_AT_TYPE_CALLER_IMAGE)
397 if (__sourceFilePath.IsEmpty() == false)
399 destFilePath = App::GetInstance()->GetAppRootPath() + TEMP_FILE_PATH_CONTACT_IMAGE;
400 r = pCropBuffer->EncodeToFile(destFilePath, IMG_FORMAT_JPG, true, 100);
401 Contact* pContact = null;
402 AddressbookManager* pAddressbookManager = AddressbookManager::GetInstance();
403 Addressbook* pAddressbook = null;
405 pAddressbook = pAddressbookManager->GetAddressbookN(DEFAULT_ADDRESSBOOK_ID);
406 if (pAddressbook != null)
408 pContact = pAddressbook->GetContactN(__contentId);
409 if (pContact != null)
411 pContact->SetThumbnail(destFilePath);
412 pAddressbook->UpdateContact(*pContact);
420 pSceneManager->GoBackward(BackwardSceneTransition());
426 MessageBox messageBox;
427 messageBox.Construct(L"", ResourceManager::GetString(L"IDS_IV_POP_INVALID_IMAGE_FILE"), MSGBOX_STYLE_NONE, 3000);
429 messageBox.ShowAndWait(modalResult);
430 UiApp* pApp = UiApp::GetInstance();
437 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
441 ImageCropForm::OnOrientationChanged(const Control &source, OrientationStatus orientationStatus)
443 AppLogDebug("ENTER");
444 __isOrientationChanged = true;
447 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
451 ImageCropForm::OnTouchPressed(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo)
453 AppLogDebug("ENTER");
454 __touchStart = currentPosition;
455 CheckCurrentPosition(currentPosition);
456 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
460 ImageCropForm::OnTouchMoved(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo)
462 AppLogDebug("ENTER");
463 int deltaX = currentPosition.x - __touchStart.x;
464 int deltaY = currentPosition.y - __touchStart.y;
465 if (__cropMode.Equals(APPCONTROL_DATA_AUTO, false))
467 switch(__pointLocation)
469 case INSIDE_TOP_RECTANGLE:
471 if ((__cropBox.y + deltaY) > __imageBox.y && deltaY < (__cropBox.height - (H_CROP_RECTANGLE * 3)))
473 __cropBox.y += deltaY;
474 __cropBox.height -= deltaY;
479 case INSIDE_BOTTOM_RECTANGLE:
481 if ((__cropBox.y + __cropBox.height + deltaY) < (__imageBox.y + __imageBox.height)
482 && (__cropBox.height + deltaY) > (H_CROP_RECTANGLE * 3))
484 __cropBox.height += deltaY;
489 case INSIDE_LEFT_RECTANGLE:
491 if ((__cropBox.x + deltaX) > __imageBox.x && deltaX < __cropBox.width - (H_CROP_RECTANGLE * 3))
493 __cropBox.x += deltaX;
494 __cropBox.width -= deltaX;
499 case INSIDE_RIGHT_RECTANGLE:
501 if ((__cropBox.x + __cropBox.width + deltaX) < (__imageBox.x + __imageBox.width)
502 && __cropBox.width + deltaX > (H_CROP_RECTANGLE * 3))
504 __cropBox.width += deltaX;
509 case INSIDE_TOP_LEFT_RECTANGLE:
511 if ((__cropBox.y + deltaY) > __imageBox.y && deltaY < (__cropBox.height - (H_CROP_RECTANGLE * 3))
512 && (__cropBox.x + deltaX) > __imageBox.x && deltaX < __cropBox.width - (H_CROP_RECTANGLE * 3))
514 __cropBox.y += deltaY;
515 __cropBox.height -= deltaY;
516 __cropBox.x += deltaX;
517 __cropBox.width -= deltaX;
522 case INSIDE_TOP_RIGHT_RECTANGLE:
524 if ((__cropBox.y + deltaY) > __imageBox.y && deltaY < (__cropBox.height - (H_CROP_RECTANGLE * 3))
525 && (__cropBox.x + __cropBox.width + deltaX) < (__imageBox.x + __imageBox.width) && __cropBox.width + deltaX > (H_CROP_RECTANGLE * 3))
527 __cropBox.width += deltaX;
528 __cropBox.y += deltaY;
529 __cropBox.height -= deltaY;
534 case INSIDE_BOTTOM_LEFT_RECTANGLE:
536 if ((__cropBox.y + __cropBox.height + deltaY) < (__imageBox.y + __imageBox.height) && (__cropBox.height + deltaY) > (H_CROP_RECTANGLE * 3)
537 && (__cropBox.x + deltaX) > __imageBox.x && deltaX < __cropBox.width - (H_CROP_RECTANGLE * 3))
539 __cropBox.x += deltaX;
540 __cropBox.width -= deltaX;
541 __cropBox.height += deltaY;
546 case INSIDE_BOTTOM_RIGHT_RECTANGLE:
548 if ((__cropBox.x + __cropBox.width + deltaX) < (__imageBox.x + __imageBox.width) && __cropBox.width + deltaX > (H_CROP_RECTANGLE * 3)
549 && (__cropBox.y + __cropBox.height + deltaY) < (__imageBox.y + __imageBox.height) && (__cropBox.height + deltaY) > (H_CROP_RECTANGLE * 3))
551 __cropBox.width += deltaX;
552 __cropBox.height += deltaY;
559 if ((__cropBox.x + deltaX) > __imageBox.x)
561 __cropBox.x += deltaX;
565 __cropBox.x = __imageBox.x;
567 if ((__cropBox.y + deltaY) > __imageBox.y)
569 __cropBox.y += deltaY;
573 __cropBox.y = __imageBox.y;
575 if ((__cropBox.x + __cropBox.width + deltaX) > (__imageBox.x + __imageBox.width))
577 __cropBox.x = __imageBox.x + __imageBox.width - __cropBox.width;
579 if ((__cropBox.y + __cropBox.height + deltaY) > (__imageBox.y + __imageBox.height))
581 __cropBox.y = __imageBox.y + __imageBox.height - __cropBox.height;
590 else if (__cropMode.Equals(APPCONTROL_DATA_FIT_TO_SCREEN, false))
592 if (__pointLocation == INSIDE_LEFT_RECTANGLE || __pointLocation == INSIDE_BOTTOM_LEFT_RECTANGLE
593 || __pointLocation == INSIDE_TOP_LEFT_RECTANGLE)
595 int temp = __cropBox.height;
596 int height = (__formHeight * (__cropBox.width - (2 * deltaX))) /__formWidth;
597 temp = height - temp;
598 if ((__cropBox.width - (2 * deltaX) > (H_CROP_RECTANGLE * 3)) && (!(height >= __imageBox.height || (__cropBox.width - (2 * deltaX)) >= __imageBox.width)))
600 if (__cropBox.x + deltaX >= __imageBox.x && __cropBox.x + __cropBox.width - deltaX <= __imageBox.x + __imageBox.width
601 && __cropBox.y - (temp / 2) >= __imageBox.y && __cropBox.y + __cropBox.height + (temp / 2) < __imageBox.y + __imageBox.height
602 && (__cropBox.width - (2 * deltaX) > (H_CROP_RECTANGLE * 3)))
604 __cropBox.x += deltaX;
605 __cropBox.width = __cropBox.width - (2 * deltaX);
606 __cropBox.height = height;
607 __cropBox.y = __cropBox.y - (temp / 2);
609 else if ((__cropBox.y + __cropBox.height) <= (__imageBox.y + __imageBox.height)
610 && __cropBox.width < __imageBox.width
611 && __cropBox.x + deltaX >= __imageBox.x && __cropBox.y - temp >= __imageBox.y )
613 if (__cropBox.x + __cropBox.width - deltaX <= __imageBox.x + __imageBox.width
614 && __cropBox.x + deltaX >= __imageBox.x)
616 __cropBox.x += deltaX;
620 __cropBox.x = __cropBox.x + (2 * deltaX);
622 __cropBox.width = __cropBox.width - (2 * deltaX);
623 __cropBox.height = height;
624 __cropBox.y = __cropBox.y - temp;
626 else if (__cropBox.y - (temp / 2) <= __imageBox.y && __cropBox.width - (deltaX) <= __imageBox.width
627 && __cropBox.x + deltaX >= __imageBox.x && __cropBox.y + __cropBox.height + temp <= __imageBox.y + __imageBox.height)
629 if (__cropBox.x + __cropBox.width - deltaX <= __imageBox.x + __imageBox.width)
631 __cropBox.x += deltaX;
635 __cropBox.x = __cropBox.x + (2 * deltaX);
637 __cropBox.width = __cropBox.width - (2 * deltaX);
638 __cropBox.height = height;
642 else if (__pointLocation == INSIDE_RIGHT_RECTANGLE || __pointLocation == INSIDE_BOTTOM_RIGHT_RECTANGLE
643 || __pointLocation == INSIDE_TOP_RIGHT_RECTANGLE)
647 int temp = __cropBox.height;
648 int height = (__formHeight * (__cropBox.width - (2 * deltaX))) / __formWidth;
649 temp = height - temp;
650 if ((__cropBox.width - (2 * deltaX) > (H_CROP_RECTANGLE * 3)) && (!(height >= __imageBox.height || (__cropBox.width - (2 * deltaX)) >= __imageBox.width)))
652 if (deltaX < __cropBox.width - (H_CROP_RECTANGLE * 3))
654 if (__cropBox.x + deltaX > __imageBox.x && __cropBox.x + __cropBox.width - deltaX <= __imageBox.x + __imageBox.width
655 && __cropBox.y - (temp / 2) > __imageBox.y && __cropBox.y + __cropBox.height + (temp / 2) < __imageBox.y + __imageBox.height)
657 __cropBox.x += deltaX;
658 __cropBox.width = __cropBox.width - (2 * deltaX);;
659 __cropBox.height = height;
660 __cropBox.y = __cropBox.y - (temp / 2);
662 else if ((__cropBox.y + __cropBox.height + (temp / 2)) >= (__imageBox.y + __imageBox.height)
663 && __cropBox.x + __cropBox.width - (2 * deltaX) <= __imageBox.x + __imageBox.width
664 && __cropBox.x - deltaX >= __imageBox.x && __cropBox.y - temp >= __imageBox.y )
666 if (__cropBox.x + __cropBox.width - deltaX <= __imageBox.x + __imageBox.width
667 && __cropBox.x + deltaX >= __imageBox.x)
669 __cropBox.x += deltaX;
673 __cropBox.width = __cropBox.width - (2 * deltaX);
675 __cropBox.width = __cropBox.width - (2 * deltaX);
676 __cropBox.height = height;
677 __cropBox.y = __cropBox.y - temp;
679 else if (__cropBox.y - (temp / 2) <= __imageBox.y && __cropBox.width - (deltaX) <= __imageBox.width
680 && __cropBox.x + deltaX <= __imageBox.x && __cropBox.y + __cropBox.height + temp <= __imageBox.y + __imageBox.height)
682 if (__cropBox.x + deltaX >= __imageBox.x)
684 __cropBox.x += deltaX;
688 __cropBox.x = __imageBox.x;
690 __cropBox.width = __cropBox.width - (2 * deltaX);
691 __cropBox.height = height;
693 else if (__cropBox.y - (temp / 2) <= __imageBox.y && __cropBox.x + deltaX >= __imageBox.x
694 && __cropBox.x + __cropBox.width - deltaX <= __imageBox.x + __imageBox.width
695 && __cropBox.y + __cropBox.height + temp <= __imageBox.y + __imageBox.height)
697 __cropBox.x += deltaX;
698 __cropBox.width = __cropBox.width - (2 * deltaX);
699 __cropBox.height = height;
701 else if (__cropBox.x + deltaX <= __imageBox.x && __cropBox.y - (temp / 2) >= __imageBox.y
702 && __cropBox.x + __cropBox.width - deltaX <= __imageBox.x + __imageBox.width
703 && __cropBox.y + __cropBox.height + temp <= __imageBox.y + __imageBox.height)
705 __cropBox.width = __cropBox.width - (2 * deltaX);
706 __cropBox.y = __cropBox.y - (temp / 2);
707 __cropBox.height = height;
712 else if (__pointLocation == INSIDE_TOP_RECTANGLE)
714 int temp = __cropBox.width;
715 int width = (__formWidth * (__cropBox.height - (2 * deltaY))) / __formHeight;
717 if (__cropBox.height - (2 * deltaY) > (__formHeight * (H_CROP_RECTANGLE * 3)) / __formWidth && (!(__cropBox.height - (2 * deltaY) >= __imageBox.height || width >= __imageBox.width)))
719 if (__cropBox.x - (temp /2 ) > __imageBox.x && __cropBox.x + __cropBox.width + temp < __imageBox.x + __imageBox.width
720 && __cropBox.y + (deltaY) > __imageBox.y && __cropBox.y + __cropBox.height - (2 * deltaY) < __imageBox.y + __imageBox.height)
722 __cropBox.y += deltaY;
723 __cropBox.height = __cropBox.height - (2 * deltaY);
724 __cropBox.width = width;
725 __cropBox.x = __cropBox.x - (temp / 2);
727 else if (__cropBox.x - (temp / 2) < __imageBox.x)
729 if (__cropBox.x + __cropBox.width + temp <= __imageBox.x + __imageBox.width)
731 __cropBox.width = width;
733 if (__cropBox.y + deltaY >= __imageBox.y)
735 __cropBox.y += deltaY;
737 if (__cropBox.y + __cropBox.height - (2 * deltaY) < __imageBox.y + __imageBox.height)
739 __cropBox.height = __cropBox.height - (2 * deltaY);
742 else if (__cropBox.y + __cropBox.height - (2 * deltaY) >= __imageBox.x + __imageBox.height
743 && __cropBox.y + (2 * deltaY) >= __imageBox.y)
745 if (__cropBox.x - temp >= __imageBox.x
746 && __cropBox.x + __cropBox.width + temp > __imageBox.x + __imageBox.width)
748 __cropBox.x = __cropBox.x - temp;
750 else if (__cropBox.x - temp >= __imageBox.x)
752 __cropBox.x = __cropBox.x - temp / 2;
754 if (__cropBox.x + __cropBox.width + temp <= __imageBox.x + __imageBox.width)
756 __cropBox.width = width;
758 if (__cropBox.y + (2 * deltaY) >= __imageBox.y)
760 __cropBox.y = __cropBox.y + (2 * deltaY);
761 __cropBox.height = __cropBox.height - (2 * deltaY);
764 else if (__cropBox.x + __cropBox.width + (temp / 2) > __imageBox.x + __imageBox.width
765 && __cropBox.x - temp >= __imageBox.x && __cropBox.y + deltaY >= __imageBox.y
766 && __cropBox.y + __cropBox.height - (2 * deltaY) <= __imageBox.y + __imageBox.height)
768 __cropBox.x = __cropBox.x - temp;
769 __cropBox.width = width;
770 __cropBox.y += deltaY;
771 __cropBox.height = __cropBox.height - (2 * deltaY);
775 else if (__pointLocation == INSIDE_BOTTOM_RECTANGLE)
777 deltaY = deltaY * (-1);
778 int temp = __cropBox.width;
779 int width = (__formWidth * (__cropBox.height - (2 * deltaY))) / __formHeight;
781 if (__cropBox.height - (2 * deltaY) > (__formHeight * (H_CROP_RECTANGLE * 3)) / __formWidth && (!(__cropBox.height - (2 * deltaY) >= __imageBox.height || width >= __imageBox.width)))
783 if (__cropBox.x - (temp / 2) >= __imageBox.x && __cropBox.x + __cropBox.width + temp < __imageBox.x + __imageBox.width
784 && __cropBox.y + deltaY > __imageBox.y && __cropBox.y + __cropBox.height - (2 * deltaY) < __imageBox.y + __imageBox.height)
786 __cropBox.y += deltaY;
787 __cropBox.height = __cropBox.height - (2 * deltaY);;
788 __cropBox.width = width;
789 __cropBox.x = __cropBox.x - (temp / 2);
791 else if (__cropBox.y + deltaY < __imageBox.y && __cropBox.y + __cropBox.height - (2 * deltaY) < __imageBox.y + __imageBox.height
792 && __cropBox.x - (temp / 2) > __imageBox.x && __cropBox.x + __cropBox.width + temp < __imageBox.x + __imageBox.width)
794 __cropBox.x = __cropBox.x - (temp / 2);
795 __cropBox.width = width;
796 __cropBox.height = __cropBox.height - (2 * deltaY);
798 else if (__cropBox.x + __cropBox.width + temp > __imageBox.x + __imageBox.width
799 && __cropBox.y + deltaY >= __imageBox.y && __cropBox.y + __cropBox.height + temp <= __imageBox.y + __imageBox.height
800 && __cropBox.x - temp >= __imageBox.x)
802 __cropBox.x = __cropBox.x - temp;
803 __cropBox.y += deltaY;
804 __cropBox.width = width;
805 __cropBox.height = __cropBox.height - (2 * deltaY);
807 else if (__cropBox.x + __cropBox.width + temp >= __imageBox.x + __imageBox.width
808 && __cropBox.y + deltaY <= __imageBox.y && __cropBox.x - temp > __imageBox.x
809 && __cropBox.y + __cropBox.height + temp < __imageBox.y + __imageBox.height)
812 __cropBox.width = width;
813 __cropBox.height = __cropBox.height - (2 * deltaY);
815 else if (__cropBox.x - temp < __imageBox.x && __cropBox.x + __cropBox.width + temp <= __imageBox.x + __imageBox.width
816 && __cropBox.y + __cropBox.height - (2 * deltaY) <= __imageBox.y + __imageBox.height)
818 if (__cropBox.y + deltaY >= __imageBox.y)
820 __cropBox.y += deltaY;
822 __cropBox.width = width;
823 __cropBox.height = __cropBox.height - (2 * deltaY);
827 else if (__pointLocation == INSIDE_CROPBOX)
829 if ((__cropBox.x + deltaX) > __imageBox.x)
831 __cropBox.x += deltaX;
835 __cropBox.x = __imageBox.x;
837 if ((__cropBox.y + deltaY) > __imageBox.y)
839 __cropBox.y += deltaY;
843 __cropBox.y = __imageBox.y;
845 if ((__cropBox.x + __cropBox.width + deltaX) > (__imageBox.x + __imageBox.width))
847 __cropBox.x = __imageBox.x + __imageBox.width - __cropBox.width;
849 if ((__cropBox.y + __cropBox.height + deltaY) > (__imageBox.y + __imageBox.height))
851 __cropBox.y = __imageBox.y + __imageBox.height - __cropBox.height;
855 RequestRedraw(false);
856 __touchStart = currentPosition;
857 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
861 ImageCropForm::OnTouchReleased(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo)
863 AppLogDebug("ENTER");
864 __pointLocation = OUTSIDE_CROPBOX;
865 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
869 ImageCropForm::CheckCurrentPosition(const Point currentPosition)
871 AppLogDebug("ENTER");
872 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)
873 && currentPosition.y > (__cropBox.y - (H_CROP_RECTANGLE / 2) - CROP_BOX_OFFSET) && currentPosition.y < (__cropBox.y + (H_CROP_RECTANGLE / 2) + CROP_BOX_OFFSET))
875 __pointLocation = INSIDE_TOP_RECTANGLE;
877 else if (currentPosition.x > (__cropBox.x - (H_CROP_RECTANGLE / 2) - CROP_BOX_OFFSET) && currentPosition.x < (__cropBox.x + (H_CROP_RECTANGLE / 2) + CROP_BOX_OFFSET)
878 && 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))
880 __pointLocation = INSIDE_LEFT_RECTANGLE;
882 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)
883 && 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))
885 __pointLocation = INSIDE_RIGHT_RECTANGLE;
887 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)
888 && 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))
890 __pointLocation = INSIDE_BOTTOM_RECTANGLE;
892 else if (currentPosition.x > (__cropBox.x - (H_CROP_RECTANGLE / 2) - CROP_BOX_OFFSET) && currentPosition.x < (__cropBox.x + (H_CROP_RECTANGLE / 2) + CROP_BOX_OFFSET)
893 && currentPosition.y > (__cropBox.y - (H_CROP_RECTANGLE / 2) - CROP_BOX_OFFSET) && currentPosition.y < (__cropBox.y +(H_CROP_RECTANGLE / 2) + CROP_BOX_OFFSET))
895 __pointLocation = INSIDE_TOP_LEFT_RECTANGLE;
897 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)
898 && currentPosition.y > (__cropBox.y - (H_CROP_RECTANGLE / 2) - CROP_BOX_OFFSET) && currentPosition.y < (__cropBox.y +(H_CROP_RECTANGLE / 2) + CROP_BOX_OFFSET))
900 __pointLocation = INSIDE_TOP_RIGHT_RECTANGLE;
902 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)
903 && 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))
905 __pointLocation = INSIDE_BOTTOM_RIGHT_RECTANGLE;
907 else if (currentPosition.x > (__cropBox.x - (H_CROP_RECTANGLE / 2) - CROP_BOX_OFFSET) && currentPosition.x < (__cropBox.x + (H_CROP_RECTANGLE / 2) + CROP_BOX_OFFSET)
908 && 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))
910 __pointLocation = INSIDE_BOTTOM_LEFT_RECTANGLE;
912 else if (currentPosition.x > __cropBox.x && currentPosition.x < (__cropBox.x + __cropBox.width) && currentPosition.y > __cropBox.y && currentPosition.y < (__cropBox.y + __cropBox.height))
914 __pointLocation = INSIDE_CROPBOX;
918 __pointLocation = OUTSIDE_CROPBOX;
920 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
925 ImageCropForm::SetValue(void)
927 int prevHeight = __imageBox.height;
928 int prevWidth = __imageBox.width;
929 int prevImageboxX = __imageBox.x;
930 int prevImageBoxY = __imageBox.y;
931 Panel* pPanel = null;
932 pPanel = static_cast<Panel*>(GetControl(L"IDC_FOOTER_PANEL"));
934 if (GetOrientationStatus() == ORIENTATION_STATUS_PORTRAIT)
936 __formHeight = Form::GetBounds().height;
937 __formWidth = Form::GetBounds().width;
939 else if (GetOrientationStatus() == ORIENTATION_STATUS_LANDSCAPE || GetOrientationStatus() == ORIENTATION_STATUS_LANDSCAPE_REVERSE)
941 __formHeight = Form::GetBounds().width;
942 __formWidth = Form::GetBounds().height;
945 float clientAreaRatio = (GetClientAreaBoundsF().height - pPanel->GetBounds().height) / GetClientAreaBoundsF().width;
947 if (__imageWidth >= GetClientAreaBounds().width || __imageHeight > (GetClientAreaBounds().height - pPanel->GetBounds().height))
949 float imageRatio = __imageHeight / (float) __imageWidth;
950 if (imageRatio < clientAreaRatio)
952 __imageBox.width = GetClientAreaBounds().width;
953 __imageBox.height = (__imageHeight * __imageBox.width) / __imageWidth;
954 __imageBox.x = GetClientAreaBounds().x;
955 __imageBox.y = GetClientAreaBounds().y + ((GetClientAreaBounds().height - pPanel->GetBounds().height) - __imageBox.height) / 2;
959 __imageBox.height = GetClientAreaBounds().height - pPanel->GetBounds().height;
960 __imageBox.width = (__imageWidth * __imageBox.height) / __imageHeight;
961 __imageBox.x = (GetClientAreaBounds().width - __imageBox.width) / 2;
962 __imageBox.y = GetClientAreaBounds().y;
967 __imageBox.height = __imageHeight;
968 __imageBox.width = __imageWidth;
969 __imageBox.x = (GetClientAreaBounds().width - __imageBox.width) / 2;
970 __imageBox.y = (GetClientAreaBounds().height - __imageBox.height) / 2 ;
972 if (__isOrientationChanged == false)
974 if (__imageBox.height > __imageBox.width)
976 __cropBox.width = (2 * __imageBox.width) / 3;
977 __cropBox.height = (__formHeight * __cropBox.width / __formWidth);
978 if (__cropBox.height > __imageBox.height)
980 __cropBox.height = (2 * __imageBox.height) / 3;
981 __cropBox.width = (__cropBox.height * __formWidth) / __formHeight;
983 __cropBox.y = __imageBox.y + (__imageBox.height - __cropBox.height) / 2;
984 __cropBox.x = __imageBox.x + (__imageBox.width - __cropBox.width) / 2;
988 __cropBox.height = (2 *__imageBox.height) / 3;
989 __cropBox.width = (__formWidth * __cropBox.height / __formHeight);
990 if (__cropBox.width > __imageBox.width)
992 __cropBox.width = (2 * __imageBox.width) / 3;
993 __cropBox.height = (__formHeight * __cropBox.width) / __formWidth;
995 __cropBox.y = __imageBox.y + (__imageBox.height - __cropBox.height) / 2;
996 __cropBox.x = __imageBox.x + (__imageBox.width - __cropBox.width) / 2;
1001 float temp = __imageBox.x + ((__cropBox.x - prevImageboxX) * __imageBox.width) / (float) prevWidth;
1002 __cropBox.x = (temp + 0.5);
1003 temp = __imageBox.y + ((__cropBox.y - prevImageBoxY) * __imageBox.height) / (float) prevHeight;
1004 __cropBox.y = (temp + 0.5);
1005 temp = (__cropBox.height * __imageBox.height) / (float) prevHeight;
1006 __cropBox.height = (temp + 0.5);
1007 temp = (__cropBox.width * __imageBox.width) / (float) prevWidth;
1008 __cropBox.width = (temp + 0.5);
1010 __pCanvas = GetCanvasN();
1011 __pCanvas->SetForegroundColor(CROP_BOX_RECTANGLE_COLOR);
1015 ImageCropForm::OnFormFileEventOccuered(const int index, const unsigned long eventId)
1017 AppLogDebug(" ENTER");
1018 UiApp::GetInstance()->Terminate();
1019 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));