diff --git a/rtgui/editcallbacks.h b/rtgui/editcallbacks.h index 5b3bd597b..7517ef865 100644 --- a/rtgui/editcallbacks.h +++ b/rtgui/editcallbacks.h @@ -193,4 +193,6 @@ public: int getPipetteRectSize () const; EditSubscriber* getCurrSubscriber() const; virtual void getImageSize (int &w, int&h) = 0; + virtual void getPreviewCenterPos(int &x, int &y) = 0; + virtual void getPreviewSize(int &w, int &h) = 0; }; diff --git a/rtgui/imagearea.cc b/rtgui/imagearea.cc index dd891b351..28c004d3f 100644 --- a/rtgui/imagearea.cc +++ b/rtgui/imagearea.cc @@ -409,6 +409,34 @@ void ImageArea::getImageSize (int &w, int&h) } } +void ImageArea::getPreviewCenterPos(int &x, int &y) +{ + if (mainCropWindow) { + // Getting crop window size + int cW, cH; + mainCropWindow->getSize(cW, cH); + + // Converting center coord of crop window to image coord + const int cX = cW / 2; + const int cY = cH / 2; + mainCropWindow->screenCoordToImage(cX, cY, x, y); + } else { + x = y = 0; + } +} + +void ImageArea::getPreviewSize(int &w, int &h) +{ + if (mainCropWindow) { + int tmpW, tmpH; + mainCropWindow->getSize(tmpW, tmpH); + w = mainCropWindow->scaleValueToImage(tmpW); + h = mainCropWindow->scaleValueToImage(tmpH); + } else { + w = h = 0; + } +} + void ImageArea::grabFocus (CropWindow* cw) { diff --git a/rtgui/imagearea.h b/rtgui/imagearea.h index 0e8794840..72e679da6 100644 --- a/rtgui/imagearea.h +++ b/rtgui/imagearea.h @@ -143,6 +143,8 @@ public: void subscribe(EditSubscriber *subscriber) override; void unsubscribe() override; void getImageSize (int &w, int&h) override; + void getPreviewCenterPos(int &x, int &y) override; + void getPreviewSize(int &w, int &h) override; // CropWindowListener interface void cropPositionChanged (CropWindow* cw) override; diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index f75864202..ab957d32a 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -1467,6 +1467,11 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) ControlSpotPanel::SpotRow* r; LocallabParams::LocallabSpot* newSpot; + int imW, imH; // Size of image + int prW, prH; // Size of preview area + int prX, prY; // Coord of preview area center + EditDataProvider* const provider = expsettings->getEditProvider(); + switch (spotPanelEvent) { case (ControlSpotPanel::SpotCreation): // Spot creation event // Spot creation (default initialization) @@ -1503,12 +1508,30 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) r->shapeMethod = 3; } + // Calculate spot size and center position according to preview area + if (provider && !batchMode) { + provider->getImageSize(imW, imH); + provider->getPreviewCenterPos(prX, prY); + provider->getPreviewSize(prW, prH); + + if (imW && imH) { // Image loaded + // Spot center position computation + newSpot->centerX = rtengine::LIM(int(int((double)prX - (double)imW / 2.) * 2000. / (double)imW), -1000, 1000); + newSpot->centerY = rtengine::LIM(int(int((double)prY - (double)imH / 2.) * 2000. / (double)imH), -1000, 1000); + // Ellipse/rectangle size computation + newSpot->locX = rtengine::LIM(int(((double)prW / 2. - 5.) * 2000. / (double)imW), 2, newSpot->locX); + newSpot->locXL = rtengine::LIM(int(((double)prW / 2. - 5.) * 2000. / (double)imW), 2, newSpot->locXL); + newSpot->locY = rtengine::LIM(int(((double)prH / 2. - 5.) * 2000. / (double)imH), 2, newSpot->locY); + newSpot->locYT = rtengine::LIM(int(((double)prH / 2. - 5.) * 2000. / (double)imH), 2, newSpot->locYT); + } + } r->locX = newSpot->locX; r->locXL = newSpot->locXL; r->locY = newSpot->locY; r->locYT = newSpot->locYT; r->centerX = newSpot->centerX; r->centerY = newSpot->centerY; + r->circrad = newSpot->circrad; if (newSpot->qualityMethod == "enh") { @@ -1699,12 +1722,30 @@ void Locallab::write(ProcParams* pp, ParamsEdited* pedited) r->shapeMethod = 3; } + // Calculate spot size and center position according to preview area + if (provider && !batchMode) { + provider->getImageSize(imW, imH); + provider->getPreviewCenterPos(prX, prY); + provider->getPreviewSize(prW, prH); + + if (imW && imH) { // Image loaded + // Spot center position computation + newSpot->centerX = rtengine::LIM(int(int((double)prX - (double)imW / 2.) * 2000. / (double)imW), -1000, 1000); + newSpot->centerY = rtengine::LIM(int(int((double)prY - (double)imH / 2.) * 2000. / (double)imH), -1000, 1000); + // Ellipse/rectangle size computation + newSpot->locX = rtengine::LIM(int(((double)prW / 2. - 5.) * 2000. / (double)imW), 2, newSpot->locX); + newSpot->locXL = rtengine::LIM(int(((double)prW / 2. - 5.) * 2000. / (double)imW), 2, newSpot->locXL); + newSpot->locY = rtengine::LIM(int(((double)prH / 2. - 5.) * 2000. / (double)imH), 2, newSpot->locY); + newSpot->locYT = rtengine::LIM(int(((double)prH / 2. - 5.) * 2000. / (double)imH), 2, newSpot->locYT); + } + } r->locX = newSpot->locX; r->locXL = newSpot->locXL; r->locY = newSpot->locY; r->locYT = newSpot->locYT; r->centerX = newSpot->centerX; r->centerY = newSpot->centerY; + r->circrad = newSpot->circrad; if (newSpot->qualityMethod == "enh") {