2 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
4 // Licensed under the Flora License, Version 1.0 (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 "IvImageViewerPresentationModel.h"
28 #include "IvResourceManager.h"
31 using namespace Tizen::App;
32 using namespace Tizen::Base;
33 using namespace Tizen::Base::Collection;
34 using namespace Tizen::Content;
35 using namespace Tizen::Graphics;
36 using namespace Tizen::Io;
37 using namespace Tizen::Media;
38 using namespace Tizen::System;
39 using namespace Tizen::Social;
40 using namespace Tizen::Ui::Controls;
41 using namespace Tizen::Ui::Scenes;
43 static const unsigned int CROP_BOX_RECTANGLE_COLOR = Color32<199, 110, 6>::Value;
44 static const int CROP_BOX_LINE_WIDTH = 5;
46 ImageCropForm::ImageCropForm(void)
49 , __isOrientationChanged(false)
51 , __pCurrentBitmap(null)
52 , __pRectangleBitmap(null)
53 , __pointLocation(OUTSIDE_CROPBOX)
54 , __pPresentationModel(null)
58 ImageCropForm::~ImageCropForm(void)
60 if (__pCurrentBitmap != null)
62 delete __pCurrentBitmap;
64 if (__pRectangleBitmap != null)
66 delete __pRectangleBitmap;
68 if (__pCanvas != null)
75 ImageCropForm::Initialize(void)
77 Form::Construct(IDL_FORM_IMAGE_CROP);
78 Form::SetFormStyle(FORM_STYLE_NORMAL | FORM_STYLE_INDICATOR);
80 __pPresentationModel = ImageViewerPresentationModel::GetInstance();
86 ImageCropForm::OnInitializing(void)
90 AppResource* pAppResource = null;
91 Bitmap* pSaveButtonBitmap = null;
92 Bitmap* pCancelButtonBitmap = null;
93 Bitmap* pCWRotationButtonBitmap = null;
94 Bitmap* pCCWRotationButtonBitmap = null;
96 Button* pSaveButton = null;
97 Button* pCancelButton = null;
98 pAppResource = UiApp::App::GetInstance()->GetAppResource();
99 if (pAppResource != null)
101 pSaveButtonBitmap = pAppResource->GetBitmapN(IDB_IMAGE_CROP_FORM_SAVE_ICON);
102 pCancelButtonBitmap = pAppResource->GetBitmapN(IDB_IMAGE_CROP_FORM_CANCEL_ICON);
103 pCWRotationButtonBitmap = pAppResource->GetBitmapN(IDB_IMAGE_CROP_FORM_CW_ROTATION_ICON);
104 pCCWRotationButtonBitmap = pAppResource->GetBitmapN(IDB_IMAGE_CROP_FORM_CCW_ROTATION_ICON);
105 __pRectangleBitmap = pAppResource->GetBitmapN(IDB_IMAGE_CROP_RECTANGLE);
108 pPanel = static_cast<Panel*>(GetControl(L"IDC_FOOTER_PANEL"));
111 pSaveButton = static_cast<Button*>(pPanel->GetControl(L"IDC_SAVE_BUTTON"));
112 if (pSaveButton != null && pSaveButtonBitmap != null)
114 Point startPoint((pSaveButton->GetWidth() - pSaveButtonBitmap->GetWidth()) / 2,
115 (pSaveButton->GetHeight() - pSaveButtonBitmap->GetHeight()) / 2);
116 pSaveButton->SetNormalBitmap(startPoint, *pSaveButtonBitmap);
117 pSaveButton->AddActionEventListener(*this);
118 pSaveButton->SetActionId(IDA_BUTTON_SAVE);
119 delete pSaveButtonBitmap;
122 pCancelButton = static_cast<Button*>(pPanel->GetControl(L"IDC_CANCEL_BUTTON"));
123 if (pCancelButton != null && pCancelButtonBitmap != null)
125 Point startPoint((pCancelButton->GetWidth() - pCancelButtonBitmap->GetWidth()) / 2,
126 (pCancelButton->GetHeight() - pCancelButtonBitmap->GetHeight()) / 2);
127 pCancelButton->SetNormalBitmap(startPoint, *pCancelButtonBitmap);
128 pCancelButton->AddActionEventListener(*this);
129 pCancelButton->SetActionId(IDA_BUTTON_CANCEL);
130 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);
143 delete pCWRotationButtonBitmap;
144 delete pCCWRotationButtonBitmap;
149 ImageCropForm::OnSceneActivatedN(const SceneId& previousSceneId, const SceneId& currentSceneId, IList* pArgs)
151 AppLogDebug("ENTER pArgs(%x)", pArgs);
154 IEnumerator* pEnum = pArgs->GetEnumeratorN();
155 if (pEnum->MoveNext() != E_SUCCESS)
159 AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult()));
163 __sourceFilePath = *(static_cast<String*>(pEnum->GetCurrent()));
164 if (__sourceFilePath.IsEmpty() == false)
166 result r = __imageBuffer.Construct(__sourceFilePath.GetPointer());
169 __imageWidth = __imageBuffer.GetWidth();
170 __imageHeight = __imageBuffer.GetHeight();
171 __pCurrentBitmap = __imageBuffer.GetBitmapN(BITMAP_PIXEL_FORMAT_RGB565, BUFFER_SCALING_AUTO);
174 __imageFormat = img.GetImageFormat(__sourceFilePath);
176 if (pEnum->MoveNext() != E_SUCCESS)
180 AppLogDebug("EXIT 2(%s)", GetErrorMessage(GetLastResult()));
184 __cropMode = *(static_cast<String*>(pEnum->GetCurrent()));
185 if (__cropMode.IsEmpty() == false)
187 __cropMode.ToLowerCase();
188 if (__cropMode == "auto")
195 else if (__cropMode == "fit-to-screen")
197 if (pEnum->MoveNext() != E_SUCCESS)
201 AppLogDebug("EXIT 3(%s)", GetErrorMessage(GetLastResult()));
205 Integer *pStatus = static_cast<Integer*>(pEnum->GetCurrent());
208 __statusValue = pStatus->ToInt();
210 if (__statusValue == SET_AT_TYPE_CALLER_IMAGE)
212 if (pEnum->MoveNext() != E_SUCCESS)
216 AppLogDebug("EXIT 4(%s)", GetErrorMessage(GetLastResult()));
221 LongLong* pContentId = static_cast<LongLong*>(pEnum->GetCurrent());
222 if (pContentId != null)
224 __contentId = pContentId->ToLongLong();
234 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
238 ImageCropForm::OnSceneDeactivated(const SceneId& currentSceneId, const SceneId& nextSceneId)
240 AppLogDebug("ENTER");
241 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));
245 ImageCropForm::OnDraw(void)
247 result r = E_SUCCESS;
248 AppLogDebug("ENTER");
249 if (__pCanvas != null)
251 r = __pCanvas->SetLineWidth(CROP_BOX_LINE_WIDTH);
252 r = __pCanvas->DrawBitmap(Rectangle(__imageBox.x, __imageBox.y, __imageBox.width, __imageBox.height), *__pCurrentBitmap);
253 r = __pCanvas->DrawRectangle(Rectangle(__cropBox.x, __cropBox.y, __cropBox.width, __cropBox.height));
254 r = __pCanvas->DrawBitmap(Rectangle((__cropBox.x + __cropBox.width / 2) - (CROP_RECTANGLE_HEIGHT / 2), __cropBox.y - (CROP_RECTANGLE_HEIGHT / 2), CROP_RECTANGLE_HEIGHT, CROP_RECTANGLE_HEIGHT), *__pRectangleBitmap); // Top Rectangle
255 r = __pCanvas->DrawBitmap(Rectangle((__cropBox.x + __cropBox.width / 2) - (CROP_RECTANGLE_HEIGHT / 2), (__cropBox.y + __cropBox.height - (CROP_RECTANGLE_HEIGHT / 2)), CROP_RECTANGLE_HEIGHT, CROP_RECTANGLE_HEIGHT), *__pRectangleBitmap); // Bottom Rectangle
256 r = __pCanvas->DrawBitmap(Rectangle(__cropBox.x - (CROP_RECTANGLE_HEIGHT / 2), (__cropBox.y + __cropBox.height / 2) - (CROP_RECTANGLE_HEIGHT / 2), CROP_RECTANGLE_HEIGHT, CROP_RECTANGLE_HEIGHT), *__pRectangleBitmap); //Left Rectangle
257 r = __pCanvas->DrawBitmap(Rectangle(__cropBox.x + __cropBox.width - (CROP_RECTANGLE_HEIGHT / 2), (__cropBox.y + __cropBox.height / 2) - (CROP_RECTANGLE_HEIGHT / 2), CROP_RECTANGLE_HEIGHT, CROP_RECTANGLE_HEIGHT), *__pRectangleBitmap); //Right Rectangle
258 r = __pCanvas->DrawBitmap(Rectangle(__cropBox.x - (CROP_RECTANGLE_HEIGHT / 2), __cropBox.y - (CROP_RECTANGLE_HEIGHT / 2), CROP_RECTANGLE_HEIGHT, CROP_RECTANGLE_HEIGHT), *__pRectangleBitmap); // Top Left Rectangle
259 r = __pCanvas->DrawBitmap(Rectangle(__cropBox.x + __cropBox.width - (CROP_RECTANGLE_HEIGHT / 2), __cropBox.y - (CROP_RECTANGLE_HEIGHT / 2), CROP_RECTANGLE_HEIGHT, CROP_RECTANGLE_HEIGHT), *__pRectangleBitmap); // Top Right Rectangle
260 r = __pCanvas->DrawBitmap(Rectangle(__cropBox.x + __cropBox.width - (CROP_RECTANGLE_HEIGHT / 2), (__cropBox.y + __cropBox.height - (CROP_RECTANGLE_HEIGHT / 2)), CROP_RECTANGLE_HEIGHT, CROP_RECTANGLE_HEIGHT), *__pRectangleBitmap); // Bottom Right Rectangle
261 r = __pCanvas->DrawBitmap(Rectangle(__cropBox.x - (CROP_RECTANGLE_HEIGHT / 2), (__cropBox.y + __cropBox.height - (CROP_RECTANGLE_HEIGHT / 2)), CROP_RECTANGLE_HEIGHT, CROP_RECTANGLE_HEIGHT), *__pRectangleBitmap); // Bottom Left Rectangle
268 ImageCropForm::OnActionPerformed(const Tizen::Ui::Control& source, int actionId)
270 SceneManager* pSceneManager = SceneManager::GetInstance();
273 case IDA_BUTTON_CANCEL:
274 pSceneManager->GoBackward(BackwardSceneTransition());
276 case IDA_BUTTON_SAVE:
278 if (__cropMode == "auto")
280 ImageBuffer* pCropBuffer = null;
284 String stringToInsert = L"_";
285 String delimiter = L".";
286 if (__sourceFilePath.IsEmpty() == false)
288 __sourceFilePath.Reverse();
289 __sourceFilePath.IndexOf(delimiter, 0, index);
290 __sourceFilePath.Reverse();
291 __sourceFilePath.Insert(stringToInsert, __sourceFilePath.GetLength() - index - 1);
292 destFilePath.Append(__sourceFilePath);
293 destFilePath.Insert(count, destFilePath.GetLength() - index - 1);
294 while (File::IsFileExist(destFilePath) == true)
297 destFilePath.Clear();
298 destFilePath.Append(__sourceFilePath);
299 destFilePath.Insert(count, destFilePath.GetLength() - index - 1);
301 pCropBuffer = __imageBuffer.CropN(((__cropBox.x - __imageBox.x) * __imageWidth) / __imageBox.width, ((__cropBox.y - __imageBox.y) * __imageHeight) / __imageBox.height,
302 (__cropBox.width * __imageWidth) / __imageBox.width, (__cropBox.height * __imageHeight) / __imageBox.height);
303 pCropBuffer->EncodeToFile(destFilePath, __imageFormat, true, 100);
304 ContentManager::ScanFile(destFilePath);
307 ArrayList* pList = new (std::nothrow) ArrayList(SingleObjectDeleter);
308 pList->Add(new (std::nothrow) String(destFilePath));
309 pSceneManager->GoBackward(BackwardSceneTransition(), pList);
311 else if(__cropMode == "fit-to-screen")
313 ImageBuffer* pCropBuffer = null;
314 result r = E_SUCCESS;
315 pCropBuffer = __imageBuffer.CropN(((__cropBox.x - __imageBox.x) * __imageWidth) / __imageBox.width, ((__cropBox.y - __imageBox.y) * __imageHeight) / __imageBox.height,
316 (__cropBox.width * __imageWidth) / __imageBox.width, (__cropBox.height * __imageHeight) / __imageBox.height);
317 if (__statusValue == SET_AT_TYPE_HOME_SCREEN_WALLPAPER)
319 String destPath = App::GetInstance()->GetAppRootPath() + TEMP_FILE_PATH_HOME_SCREEN_WALLPAPER;
320 r = pCropBuffer->EncodeToFile(destPath, __imageFormat, true, 100);
323 r = SettingInfo::SetValue(SETTING_VALUE_HOME_SCREEN_WALLPAPER, destPath);
325 else if (r == E_OVERFLOW)
327 MessageBox messageBox;
328 messageBox.Construct(L"", L"File size is too big", MSGBOX_STYLE_NONE, 3000);
330 messageBox.ShowAndWait(modalResult);
333 else if (__statusValue == SET_AT_TYPE_LOCK_SCREEN_WALLPAPER)
335 String destPath = App::GetInstance()->GetAppRootPath() + TEMP_FILE_PATH_LOCK_SCREEN_WALLPAPER;
336 r = pCropBuffer->EncodeToFile(destPath, __imageFormat, true, 100);
339 r = SettingInfo::SetValue(SETTING_VALUE_LOCK_SCREEN_WALLPAPER, destPath);
341 else if (r == E_OVERFLOW)
343 MessageBox messageBox;
344 messageBox.Construct(L"", L"File size is too big", MSGBOX_STYLE_NONE, 3000);
346 messageBox.ShowAndWait(modalResult);
349 else if (__statusValue == SET_AT_TYPE_HOME_AND_LOCK_SCREEN_WALLPAPER)
351 String destPath = App::GetInstance()->GetAppRootPath() + TEMP_FILE_PATH_LOCK_SCREEN_WALLPAPER;
352 String destPathHome = App::GetInstance()->GetAppRootPath() + TEMP_FILE_PATH_HOME_SCREEN_WALLPAPER;
353 r = pCropBuffer->EncodeToFile(destPath, __imageFormat, true, 100);
354 r = pCropBuffer->EncodeToFile(destPathHome, __imageFormat, true, 100);
357 r = SettingInfo::SetValue(SETTING_VALUE_LOCK_SCREEN_WALLPAPER, destPath);
358 r = SettingInfo::SetValue(SETTING_VALUE_HOME_SCREEN_WALLPAPER, destPathHome);
360 else if (r == E_OVERFLOW)
362 MessageBox messageBox;
363 messageBox.Construct(L"", L"File size is too big", MSGBOX_STYLE_NONE, 3000);
365 messageBox.ShowAndWait(modalResult);
368 else if (__statusValue == SET_AT_TYPE_CALLER_IMAGE)
373 String stringToInsert = L"_";
374 String delimiter = L".";
375 if (__sourceFilePath.IsEmpty() == false)
377 __sourceFilePath.Reverse();
378 __sourceFilePath.IndexOf(delimiter, 0, index);
379 __sourceFilePath.Reverse();
380 __sourceFilePath.Insert(stringToInsert, __sourceFilePath.GetLength() - index - 1);
381 destFilePath.Append(__sourceFilePath);
382 destFilePath.Insert(count, destFilePath.GetLength() - index - 1);
383 while (File::IsFileExist(destFilePath) == true)
386 destFilePath.Clear();
387 destFilePath.Append(__sourceFilePath);
388 destFilePath.Insert(count, destFilePath.GetLength() - index - 1);
391 r = pCropBuffer->EncodeToFile(destFilePath, __imageFormat, true, 100);
392 ContentManager::ScanFile(destFilePath);
393 Contact* pContact = null;
394 AddressbookManager* pAddressbookManager = AddressbookManager::GetInstance();
395 Addressbook* pAddressbook = null;
397 pAddressbook = pAddressbookManager->GetAddressbookN(DEFAULT_ADDRESSBOOK_ID);
398 pContact = pAddressbook->GetContactN(__contentId);
399 pContact->SetThumbnail(destFilePath);
400 pAddressbook->UpdateContact(*pContact);
406 pSceneManager->GoForward(ForwardSceneTransition(IDSCN_IMAGE_VIEWER));
415 ImageCropForm::OnOrientationChanged(const Control &source, OrientationStatus orientationStatus)
417 AppLogDebug("ENTER");
418 __isOrientationChanged = true;
425 ImageCropForm::OnTouchPressed(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo)
427 AppLogDebug("ENTER");
428 __touchStart = currentPosition;
429 CheckCurrentPosition(currentPosition);
434 ImageCropForm::OnTouchMoved(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo)
436 AppLogDebug("ENTER");
437 int deltaX = currentPosition.x - __touchStart.x;
438 int deltaY = currentPosition.y - __touchStart.y;
439 if (__cropMode.Equals("auto", false))
441 switch(__pointLocation)
443 case INSIDE_TOP_RECTANGLE:
445 if ((__cropBox.y + deltaY) > __imageBox.y && deltaY < (__cropBox.height - (CROP_RECTANGLE_HEIGHT * 3)))
447 __cropBox.y += deltaY;
448 __cropBox.height -= deltaY;
453 case INSIDE_BOTTOM_RECTANGLE:
455 if ((__cropBox.y + __cropBox.height + deltaY) < (__imageBox.y + __imageBox.height)
456 && (__cropBox.height + deltaY) > (CROP_RECTANGLE_HEIGHT * 3))
458 __cropBox.height += deltaY;
463 case INSIDE_LEFT_RECTANGLE:
465 if ((__cropBox.x + deltaX) > __imageBox.x && deltaX < __cropBox.width - (CROP_RECTANGLE_HEIGHT * 3))
467 __cropBox.x += deltaX;
468 __cropBox.width -= deltaX;
473 case INSIDE_RIGHT_RECTANGLE:
475 if ((__cropBox.x + __cropBox.width + deltaX) < (__imageBox.x + __imageBox.width)
476 && __cropBox.width + deltaX > (CROP_RECTANGLE_HEIGHT * 3))
478 __cropBox.width += deltaX;
483 case INSIDE_TOP_LEFT_RECTANGLE:
485 if ((__cropBox.y + deltaY) > __imageBox.y && deltaY < (__cropBox.height - (CROP_RECTANGLE_HEIGHT * 3))
486 && (__cropBox.x + deltaX) > __imageBox.x && deltaX < __cropBox.width - (CROP_RECTANGLE_HEIGHT * 3))
488 __cropBox.y += deltaY;
489 __cropBox.height -= deltaY;
490 __cropBox.x += deltaX;
491 __cropBox.width -= deltaX;
496 case INSIDE_TOP_RIGHT_RECTANGLE:
498 if ((__cropBox.y + deltaY) > __imageBox.y && deltaY < (__cropBox.height - (CROP_RECTANGLE_HEIGHT * 3))
499 && (__cropBox.x + __cropBox.width + deltaX) < (__imageBox.x + __imageBox.width) && __cropBox.width + deltaX > (CROP_RECTANGLE_HEIGHT * 3))
501 __cropBox.width += deltaX;
502 __cropBox.y += deltaY;
503 __cropBox.height -= deltaY;
508 case INSIDE_BOTTOM_LEFT_RECTANGLE:
510 if ((__cropBox.y + __cropBox.height + deltaY) < (__imageBox.y + __imageBox.height) && (__cropBox.height + deltaY) > (CROP_RECTANGLE_HEIGHT * 3)
511 && (__cropBox.x + deltaX) > __imageBox.x && deltaX < __cropBox.width - (CROP_RECTANGLE_HEIGHT * 3))
513 __cropBox.x += deltaX;
514 __cropBox.width -= deltaX;
515 __cropBox.height += deltaY;
520 case INSIDE_BOTTOM_RIGHT_RECTANGLE:
522 if ((__cropBox.x + __cropBox.width + deltaX) < (__imageBox.x + __imageBox.width) && __cropBox.width + deltaX > (CROP_RECTANGLE_HEIGHT * 3)
523 && (__cropBox.y + __cropBox.height + deltaY) < (__imageBox.y + __imageBox.height) && (__cropBox.height + deltaY) > (CROP_RECTANGLE_HEIGHT * 3))
525 __cropBox.width += deltaX;
526 __cropBox.height += deltaY;
533 if ((__cropBox.x + deltaX) > __imageBox.x)
535 __cropBox.x += deltaX;
539 __cropBox.x = __imageBox.x;
541 if ((__cropBox.y + deltaY) > __imageBox.y)
543 __cropBox.y += deltaY;
547 __cropBox.y = __imageBox.y;
549 if ((__cropBox.x + __cropBox.width + deltaX) > (__imageBox.x + __imageBox.width))
551 __cropBox.x = __imageBox.x + __imageBox.width - __cropBox.width;
553 if ((__cropBox.y + __cropBox.height + deltaY) > (__imageBox.y + __imageBox.height))
555 __cropBox.y = __imageBox.y + __imageBox.height - __cropBox.height;
564 else if (__cropMode != "auto")
566 if (__pointLocation == INSIDE_LEFT_RECTANGLE || __pointLocation == INSIDE_BOTTOM_LEFT_RECTANGLE
567 || __pointLocation == INSIDE_TOP_LEFT_RECTANGLE)
569 int temp = __cropBox.height;
570 int height = (__formHeight * (__cropBox.width - (2 * deltaX))) /__formWidth;
571 temp = height - temp;
572 if ((__cropBox.width - (2 * deltaX) > (CROP_RECTANGLE_HEIGHT * 3)) && (!(height >= __imageBox.height || (__cropBox.width - (2 * deltaX)) >= __imageBox.width)))
574 if (__cropBox.x + deltaX >= __imageBox.x && __cropBox.x + __cropBox.width - deltaX <= __imageBox.x + __imageBox.width
575 && __cropBox.y - (temp / 2) >= __imageBox.y && __cropBox.y + __cropBox.height + (temp / 2) < __imageBox.y + __imageBox.height
576 && (__cropBox.width - (2 * deltaX) > (CROP_RECTANGLE_HEIGHT * 3)))
578 __cropBox.x += deltaX;
579 __cropBox.width = __cropBox.width - (2 * deltaX);
580 __cropBox.height = height;
581 __cropBox.y = __cropBox.y - (temp / 2);
583 else if ((__cropBox.y + __cropBox.height) <= (__imageBox.y + __imageBox.height)
584 && __cropBox.width < __imageBox.width
585 && __cropBox.x + deltaX >= __imageBox.x && __cropBox.y - temp >= __imageBox.y )
587 if (__cropBox.x + __cropBox.width - deltaX <= __imageBox.x + __imageBox.width
588 && __cropBox.x + deltaX >= __imageBox.x)
590 __cropBox.x += deltaX;
594 __cropBox.x = __cropBox.x + (2 * deltaX);
596 __cropBox.width = __cropBox.width - (2 * deltaX);
597 __cropBox.height = height;
598 __cropBox.y = __cropBox.y - temp;
600 else if (__cropBox.y - (temp / 2) <= __imageBox.y && __cropBox.width - (deltaX) <= __imageBox.width
601 && __cropBox.x + deltaX >= __imageBox.x && __cropBox.y + __cropBox.height + temp <= __imageBox.y + __imageBox.height)
603 if (__cropBox.x + __cropBox.width - deltaX <= __imageBox.x + __imageBox.width)
605 __cropBox.x += deltaX;
609 __cropBox.x = __cropBox.x + (2 * deltaX);
611 __cropBox.width = __cropBox.width - (2 * deltaX);
612 __cropBox.height = height;
616 else if (__pointLocation == INSIDE_RIGHT_RECTANGLE || __pointLocation == INSIDE_BOTTOM_RIGHT_RECTANGLE
617 || __pointLocation == INSIDE_TOP_RIGHT_RECTANGLE)
621 int temp = __cropBox.height;
622 int height = (__formHeight * (__cropBox.width - (2 * deltaX))) / __formWidth;
623 temp = height - temp;
624 if ((__cropBox.width - (2 * deltaX) > (CROP_RECTANGLE_HEIGHT * 3)) && (!(height >= __imageBox.height || (__cropBox.width - (2 * deltaX)) >= __imageBox.width)))
626 if (deltaX < __cropBox.width - (CROP_RECTANGLE_HEIGHT * 3))
628 if (__cropBox.x + deltaX > __imageBox.x && __cropBox.x + __cropBox.width - deltaX <= __imageBox.x + __imageBox.width
629 && __cropBox.y - (temp / 2) > __imageBox.y && __cropBox.y + __cropBox.height + (temp / 2) < __imageBox.y + __imageBox.height)
631 __cropBox.x += deltaX;
632 __cropBox.width = __cropBox.width - (2 * deltaX);;
633 __cropBox.height = height;
634 __cropBox.y = __cropBox.y - (temp / 2);
636 else if ((__cropBox.y + __cropBox.height + (temp / 2)) >= (__imageBox.y + __imageBox.height)
637 && __cropBox.x + __cropBox.width - (2 * deltaX) <= __imageBox.x + __imageBox.width
638 && __cropBox.x - deltaX >= __imageBox.x && __cropBox.y - temp >= __imageBox.y )
640 if (__cropBox.x + __cropBox.width - deltaX <= __imageBox.x + __imageBox.width
641 && __cropBox.x + deltaX >= __imageBox.x)
643 __cropBox.x += deltaX;
647 __cropBox.width = __cropBox.width - (2 * deltaX);
649 __cropBox.width = __cropBox.width - (2 * deltaX);
650 __cropBox.height = height;
651 __cropBox.y = __cropBox.y - temp;
653 else if (__cropBox.y - (temp / 2) <= __imageBox.y && __cropBox.width - (deltaX) <= __imageBox.width
654 && __cropBox.x + deltaX <= __imageBox.x && __cropBox.y + __cropBox.height + temp <= __imageBox.y + __imageBox.height)
656 if (__cropBox.x + deltaX >= __imageBox.x)
658 __cropBox.x += deltaX;
662 __cropBox.x = __imageBox.x;
664 __cropBox.width = __cropBox.width - (2 * deltaX);
665 __cropBox.height = height;
667 else if (__cropBox.y - (temp / 2) <= __imageBox.y && __cropBox.x + deltaX >= __imageBox.x
668 && __cropBox.x + __cropBox.width - deltaX <= __imageBox.x + __imageBox.width
669 && __cropBox.y + __cropBox.height + temp <= __imageBox.y + __imageBox.height)
671 __cropBox.x += deltaX;
672 __cropBox.width = __cropBox.width - (2 * deltaX);
673 __cropBox.height = height;
675 else if (__cropBox.x + deltaX <= __imageBox.x && __cropBox.y - (temp / 2) >= __imageBox.y
676 && __cropBox.x + __cropBox.width - deltaX <= __imageBox.x + __imageBox.width
677 && __cropBox.y + __cropBox.height + temp <= __imageBox.y + __imageBox.height)
679 __cropBox.width = __cropBox.width - (2 * deltaX);
680 __cropBox.y = __cropBox.y - (temp / 2);
681 __cropBox.height = height;
686 else if (__pointLocation == INSIDE_TOP_RECTANGLE)
688 int temp = __cropBox.width;
689 int width = (__formWidth * (__cropBox.height - (2 * deltaY))) / __formHeight;
691 if (__cropBox.height - (2 * deltaY) > (__formHeight * (CROP_RECTANGLE_HEIGHT * 3)) / __formWidth && (!(__cropBox.height - (2 * deltaY) >= __imageBox.height || width >= __imageBox.width)))
693 if (__cropBox.x - (temp /2 ) > __imageBox.x && __cropBox.x + __cropBox.width + temp < __imageBox.x + __imageBox.width
694 && __cropBox.y + (deltaY) > __imageBox.y && __cropBox.y + __cropBox.height - (2 * deltaY) < __imageBox.y + __imageBox.height)
696 __cropBox.y += deltaY;
697 __cropBox.height = __cropBox.height - (2 * deltaY);
698 __cropBox.width = width;
699 __cropBox.x = __cropBox.x - (temp / 2);
701 else if (__cropBox.x - (temp / 2) < __imageBox.x)
703 if (__cropBox.x + __cropBox.width + temp <= __imageBox.x + __imageBox.width)
705 __cropBox.width = width;
707 if (__cropBox.y + deltaY >= __imageBox.y)
709 __cropBox.y += deltaY;
711 if (__cropBox.y + __cropBox.height - (2 * deltaY) < __imageBox.y + __imageBox.height)
713 __cropBox.height = __cropBox.height - (2 * deltaY);
716 else if (__cropBox.y + __cropBox.height - (2 * deltaY) >= __imageBox.x + __imageBox.height
717 && __cropBox.y + (2 * deltaY) >= __imageBox.y)
719 if (__cropBox.x - temp >= __imageBox.x
720 && __cropBox.x + __cropBox.width + temp > __imageBox.x + __imageBox.width)
722 __cropBox.x = __cropBox.x - temp;
724 else if (__cropBox.x - temp >= __imageBox.x)
726 __cropBox.x = __cropBox.x - temp / 2;
728 if (__cropBox.x + __cropBox.width + temp <= __imageBox.x + __imageBox.width)
730 __cropBox.width = width;
732 if (__cropBox.y + (2 * deltaY) >= __imageBox.y)
734 __cropBox.y = __cropBox.y + (2 * deltaY);
735 __cropBox.height = __cropBox.height - (2 * deltaY);
738 else if (__cropBox.x + __cropBox.width + (temp / 2) > __imageBox.x + __imageBox.width
739 && __cropBox.x - temp >= __imageBox.x && __cropBox.y + deltaY >= __imageBox.y
740 && __cropBox.y + __cropBox.height - (2 * deltaY) <= __imageBox.y + __imageBox.height)
742 __cropBox.x = __cropBox.x - temp;
743 __cropBox.width = width;
744 __cropBox.y += deltaY;
745 __cropBox.height = __cropBox.height - (2 * deltaY);
749 else if (__pointLocation == INSIDE_BOTTOM_RECTANGLE)
751 deltaY = deltaY * (-1);
752 int temp = __cropBox.width;
753 int width = (__formWidth * (__cropBox.height - (2 * deltaY))) / __formHeight;
755 if (__cropBox.height - (2 * deltaY) > (__formHeight * (CROP_RECTANGLE_HEIGHT * 3)) / __formWidth && (!(__cropBox.height - (2 * deltaY) >= __imageBox.height || width >= __imageBox.width)))
757 if (__cropBox.x - (temp / 2) >= __imageBox.x && __cropBox.x + __cropBox.width + temp < __imageBox.x + __imageBox.width
758 && __cropBox.y + deltaY > __imageBox.y && __cropBox.y + __cropBox.height - (2 * deltaY) < __imageBox.y + __imageBox.height)
760 __cropBox.y += deltaY;
761 __cropBox.height = __cropBox.height - (2 * deltaY);;
762 __cropBox.width = width;
763 __cropBox.x = __cropBox.x - (temp / 2);
765 else if (__cropBox.y + deltaY < __imageBox.y && __cropBox.y + __cropBox.height - (2 * deltaY) < __imageBox.y + __imageBox.height
766 && __cropBox.x - (temp / 2) > __imageBox.x && __cropBox.x + __cropBox.width + temp < __imageBox.x + __imageBox.width)
768 __cropBox.x = __cropBox.x - (temp / 2);
769 __cropBox.width = width;
770 __cropBox.height = __cropBox.height - (2 * deltaY);
772 else if (__cropBox.x + __cropBox.width + temp > __imageBox.x + __imageBox.width
773 && __cropBox.y + deltaY >= __imageBox.y && __cropBox.y + __cropBox.height + temp <= __imageBox.y + __imageBox.height
774 && __cropBox.x - temp >= __imageBox.x)
776 __cropBox.x = __cropBox.x - temp;
777 __cropBox.y += deltaY;
778 __cropBox.width = width;
779 __cropBox.height = __cropBox.height - (2 * deltaY);
781 else if (__cropBox.x + __cropBox.width + temp >= __imageBox.x + __imageBox.width
782 && __cropBox.y + deltaY <= __imageBox.y && __cropBox.x - temp > __imageBox.x
783 && __cropBox.y + __cropBox.height + temp < __imageBox.y + __imageBox.height)
786 __cropBox.width = width;
787 __cropBox.height = __cropBox.height - (2 * deltaY);
789 else if (__cropBox.x - temp < __imageBox.x && __cropBox.x + __cropBox.width + temp <= __imageBox.x + __imageBox.width
790 && __cropBox.y + __cropBox.height - (2 * deltaY) <= __imageBox.y + __imageBox.height)
792 if (__cropBox.y + deltaY >= __imageBox.y)
794 __cropBox.y += deltaY;
796 __cropBox.width = width;
797 __cropBox.height = __cropBox.height - (2 * deltaY);
801 else if (__pointLocation == INSIDE_CROPBOX)
803 if ((__cropBox.x + deltaX) > __imageBox.x)
805 __cropBox.x += deltaX;
809 __cropBox.x = __imageBox.x;
811 if ((__cropBox.y + deltaY) > __imageBox.y)
813 __cropBox.y += deltaY;
817 __cropBox.y = __imageBox.y;
819 if ((__cropBox.x + __cropBox.width + deltaX) > (__imageBox.x + __imageBox.width))
821 __cropBox.x = __imageBox.x + __imageBox.width - __cropBox.width;
823 if ((__cropBox.y + __cropBox.height + deltaY) > (__imageBox.y + __imageBox.height))
825 __cropBox.y = __imageBox.y + __imageBox.height - __cropBox.height;
829 RequestRedraw(false);
830 __touchStart = currentPosition;
835 ImageCropForm::OnTouchReleased(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo)
837 AppLogDebug("ENTER");
838 __pointLocation = OUTSIDE_CROPBOX;
843 ImageCropForm::CheckCurrentPosition(const Point currentPosition)
845 AppLogDebug("ENTER");
846 if (currentPosition.x > ((__cropBox.x + __cropBox.width / 2) - (CROP_RECTANGLE_HEIGHT / 2)) && currentPosition.x < ((__cropBox.x + __cropBox.width / 2) + (CROP_RECTANGLE_HEIGHT / 2))
847 && currentPosition.y > (__cropBox.y - (CROP_RECTANGLE_HEIGHT / 2)) && currentPosition.y < (__cropBox.y + (CROP_RECTANGLE_HEIGHT / 2)))
849 __pointLocation = INSIDE_TOP_RECTANGLE;
851 else if (currentPosition.x > (__cropBox.x - (CROP_RECTANGLE_HEIGHT / 2)) && currentPosition.x < (__cropBox.x + (CROP_RECTANGLE_HEIGHT / 2))
852 && currentPosition.y > ((__cropBox.y + __cropBox.height / 2) - (CROP_RECTANGLE_HEIGHT / 2)) && currentPosition.y < ((__cropBox.y + __cropBox.height / 2) + (CROP_RECTANGLE_HEIGHT / 2)))
854 __pointLocation = INSIDE_LEFT_RECTANGLE;
856 else if (currentPosition.x > (__cropBox.x + __cropBox.width - (CROP_RECTANGLE_HEIGHT / 2)) && currentPosition.x < (__cropBox.x + __cropBox.width + (CROP_RECTANGLE_HEIGHT / 2))
857 && currentPosition.y > ((__cropBox.y + __cropBox.height / 2) - (CROP_RECTANGLE_HEIGHT / 2)) && currentPosition.y < ((__cropBox.y + __cropBox.height / 2) + (CROP_RECTANGLE_HEIGHT / 2)))
859 __pointLocation = INSIDE_RIGHT_RECTANGLE;
861 else if (currentPosition.x > ((__cropBox.x + __cropBox.width / 2) - (CROP_RECTANGLE_HEIGHT / 2)) && currentPosition.x < ((__cropBox.x + __cropBox.width / 2) + (CROP_RECTANGLE_HEIGHT / 2))
862 && currentPosition.y > (__cropBox.y + __cropBox.height - (CROP_RECTANGLE_HEIGHT / 2)) && currentPosition.y < (__cropBox.y + __cropBox.height + (CROP_RECTANGLE_HEIGHT / 2)))
864 __pointLocation = INSIDE_BOTTOM_RECTANGLE;
866 else if (currentPosition.x > (__cropBox.x - (CROP_RECTANGLE_HEIGHT / 2)) && currentPosition.x < (__cropBox.x + (CROP_RECTANGLE_HEIGHT / 2))
867 && currentPosition.y > (__cropBox.y - (CROP_RECTANGLE_HEIGHT / 2)) && currentPosition.y < (__cropBox.y +(CROP_RECTANGLE_HEIGHT / 2)))
869 __pointLocation = INSIDE_TOP_LEFT_RECTANGLE;
871 else if (currentPosition.x > ((__cropBox.x + __cropBox.width / 2) - (CROP_RECTANGLE_HEIGHT / 2)) && currentPosition.x < (__cropBox.x + __cropBox.width + (CROP_RECTANGLE_HEIGHT / 2))
872 && currentPosition.y > (__cropBox.y - (CROP_RECTANGLE_HEIGHT / 2)) && currentPosition.y < (__cropBox.y +(CROP_RECTANGLE_HEIGHT / 2)))
874 __pointLocation = INSIDE_TOP_RIGHT_RECTANGLE;
876 else if (currentPosition.x > (__cropBox.x + __cropBox.width - (CROP_RECTANGLE_HEIGHT / 2)) && currentPosition.x < (__cropBox.x + __cropBox.width + (CROP_RECTANGLE_HEIGHT / 2))
877 && currentPosition.y > (__cropBox.y + __cropBox.height - (CROP_RECTANGLE_HEIGHT / 2)) && currentPosition.y < (__cropBox.y + __cropBox.height + (CROP_RECTANGLE_HEIGHT / 2)))
879 __pointLocation = INSIDE_BOTTOM_RIGHT_RECTANGLE;
881 else if (currentPosition.x > (__cropBox.x - (CROP_RECTANGLE_HEIGHT / 2)) && currentPosition.x < (__cropBox.x + (CROP_RECTANGLE_HEIGHT / 2))
882 && currentPosition.y > (__cropBox.y + __cropBox.height - (CROP_RECTANGLE_HEIGHT / 2)) && currentPosition.y < (__cropBox.y + __cropBox.height + (CROP_RECTANGLE_HEIGHT / 2)))
884 __pointLocation = INSIDE_BOTTOM_LEFT_RECTANGLE;
886 else if (currentPosition.x > __cropBox.x && currentPosition.x < (__cropBox.x + __cropBox.width) && currentPosition.y > __cropBox.y && currentPosition.y < (__cropBox.y + __cropBox.height))
888 __pointLocation = INSIDE_CROPBOX;
892 __pointLocation = OUTSIDE_CROPBOX;
899 ImageCropForm::SetValue(void)
901 int prevHeight = __imageBox.height;
902 int prevWidth = __imageBox.width;
903 int prevImageboxX = __imageBox.x;
904 int prevImageBoxY = __imageBox.y;
905 if (GetOrientationStatus() == ORIENTATION_STATUS_PORTRAIT)
907 __formHeight = Form::GetBounds().height;
908 __formWidth = Form::GetBounds().width;
910 else if(GetOrientationStatus() == ORIENTATION_STATUS_LANDSCAPE || GetOrientationStatus() == ORIENTATION_STATUS_LANDSCAPE_REVERSE)
912 __formHeight = Form::GetBounds().width;
913 __formWidth = Form::GetBounds().height;
916 float clientAreaRatio = (GetClientAreaBoundsF().height - FOOTER_PANEL_HEIGHT) / GetClientAreaBoundsF().width;
917 if (__imageWidth >= GetClientAreaBounds().width || __imageHeight > (GetClientAreaBounds().height - FOOTER_PANEL_HEIGHT))
919 float imageRatio = __imageHeight / (float) __imageWidth;
920 if (imageRatio < clientAreaRatio)
922 __imageBox.width = GetClientAreaBounds().width;
923 __imageBox.height = (__imageHeight * __imageBox.width) / __imageWidth;
924 __imageBox.x = GetClientAreaBounds().x;
925 __imageBox.y = GetClientAreaBounds().y + ((GetClientAreaBounds().height - FOOTER_PANEL_HEIGHT) - __imageBox.height) / 2;
929 __imageBox.height = GetClientAreaBounds().height - FOOTER_PANEL_HEIGHT;
930 __imageBox.width = (__imageWidth * __imageBox.height) / __imageHeight;
931 __imageBox.x = (GetClientAreaBounds().width - __imageBox.width) / 2;
932 __imageBox.y = GetClientAreaBounds().y;
937 __imageBox.height = __imageHeight;
938 __imageBox.width = __imageWidth;
939 __imageBox.x = (GetClientAreaBounds().width - __imageBox.width) / 2;
940 __imageBox.y = (GetClientAreaBounds().height - __imageBox.height) / 2 ;
942 if (__isOrientationChanged == false)
944 if (__imageBox.height > __imageBox.width)
946 __cropBox.width = (2 * __imageBox.width) / 3;
947 __cropBox.height = (__formHeight * __cropBox.width / __formWidth);
948 __cropBox.y = __imageBox.y + (__imageBox.height - __cropBox.height) / 2;
949 __cropBox.x = __imageBox.x + (__imageBox.width - __cropBox.width) / 2;
953 __cropBox.height = (2 *__imageBox.height) / 3;
954 __cropBox.width = (__formWidth * __cropBox.height / __formHeight);
955 __cropBox.y = __imageBox.y + (__imageBox.height - __cropBox.height) / 2;
956 __cropBox.x = __imageBox.x + (__imageBox.width - __cropBox.width) / 2;
961 float temp = __imageBox.x + ((__cropBox.x - prevImageboxX) * __imageBox.width) / (float)prevWidth;
962 __cropBox.x = (temp + 0.5);
963 temp = __imageBox.y + ((__cropBox.y - prevImageBoxY) * __imageBox.height) / (float)prevHeight;
964 __cropBox.y = (temp + 0.5);
965 temp = (__cropBox.height * __imageBox.height) / (float)prevHeight;
966 __cropBox.height = (temp + 0.5);
967 temp = (__cropBox.width * __imageBox.width) / (float)prevWidth;
968 __cropBox.width = (temp + 0.5);
970 __pCanvas = GetCanvasN();
971 __pCanvas->SetForegroundColor(CROP_BOX_RECTANGLE_COLOR);
974 void ImageCropForm::OnFormFileEventOccuered(const int index, const unsigned long eventId)
976 AppLogDebug(" ENTER");
977 UiApp::GetInstance()->Terminate();
978 AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult()));