Thumbnail rotation does not include crop rotation, on behalf of Adam Reichold, Issue 1716

This commit is contained in:
Ingo
2014-02-22 23:58:17 +01:00
parent 58ac08a889
commit 7500c3827d

View File

@@ -305,7 +305,120 @@ void BatchToolPanelCoordinator::panelChanged (rtengine::ProcEvent event, const G
for (size_t i=0; i<toolPanels.size(); i++)
toolPanels[i]->write (&pparams, &pparamsEdited);
// TODO: We may update the crop on coarse rotate events here, like in ToolPanelCoordinator::panelChanged
// If only a single item is selected, we emulate the behaviour of the editor tool panel coordinator,
// otherwise we adjust the inital parameters on a per-image basis.
if (selected.size()==1) {
// Compensate rotation on flip
if (event==rtengine::EvCTHFlip || event==rtengine::EvCTVFlip) {
if (fabs(pparams.rotate.degree)>0.001) {
pparams.rotate.degree *= -1;
rotate->read (&pparams);
}
}
int w, h;
selected[0]->getFinalSize (selected[0]->getProcParams (), w, h);
crop->setDimensions(w, h);
// Some transformations change the crop and resize parameter for convenience.
if (event==rtengine::EvCTHFlip) {
crop->hFlipCrop ();
crop->write (&pparams, &pparamsEdited);
}
else if (event==rtengine::EvCTVFlip) {
crop->vFlipCrop ();
crop->write (&pparams, &pparamsEdited);
}
else if (event==rtengine::EvCTRotate) {
crop->rotateCrop (pparams.coarse.rotate, pparams.coarse.hflip, pparams.coarse.vflip);
crop->write (&pparams, &pparamsEdited);
resize->update (pparams.crop.enabled, pparams.crop.w, pparams.crop.h, w, h);
resize->write (&pparams, &pparamsEdited);
}
else if (event==rtengine::EvCrop) {
resize->update (pparams.crop.enabled, pparams.crop.w, pparams.crop.h);
resize->write (&pparams, &pparamsEdited);
}
}
else {
// Compensate rotation on flip
if (event==rtengine::EvCTHFlip || event==rtengine::EvCTVFlip) {
for (size_t i=0; i<selected.size(); i++) {
if (fabs(initialPP[i].rotate.degree) > 0.001) {
initialPP[i].rotate.degree *= -1.0;
pparamsEdited.rotate.degree = false;
}
}
}
// some transformations make the crop change for convenience
if (event==rtengine::EvCTHFlip) {
for (size_t i=0; i<selected.size(); i++) {
int w, h;
selected[i]->getFinalSize (selected[i]->getProcParams (), w, h);
rtengine::procparams::CropParams& crop = initialPP[i].crop;
crop.x = w - crop.x - crop.w;
pparamsEdited.crop.x = false;
}
}
else if (event==rtengine::EvCTVFlip) {
for (size_t i=0; i<selected.size(); i++) {
int w, h;
selected[i]->getFinalSize (selected[i]->getProcParams (), w, h);
rtengine::procparams::CropParams& crop = initialPP[i].crop;
crop.y = h - crop.y - crop.h;
pparamsEdited.crop.y = false;
}
}
else if (event==rtengine::EvCTRotate) {
int newDeg = pparams.coarse.rotate;
for (size_t i=0; i<selected.size(); i++) {
int w, h;
selected[i]->getFinalSize (selected[i]->getProcParams (), w, h);
int oldDeg = initialPP[i].coarse.rotate;
rtengine::procparams::CropParams& crop = initialPP[i].crop;
int rotation = (360 + newDeg - oldDeg) % 360;
ProcParams pptemp = selected[i]->getProcParams(); // Get actual procparams
if((pptemp.coarse.hflip != pptemp.coarse.vflip) && ((rotation%180)==90))
rotation = (rotation + 180)%360;
switch (rotation) {
case 90:
std::swap(crop.x, crop.y);
std::swap(crop.w, crop.h);
crop.x = h - crop.x - crop.w;
break;
case 270:
std::swap(crop.x, crop.y);
std::swap(crop.w, crop.h);
crop.y = w - crop.y - crop.h;
break;
case 180:
crop.x = w - crop.x - crop.w;
crop.y = h - crop.y - crop.h;
break;
}
initialPP[i].coarse.rotate = newDeg;
}
pparamsEdited.crop.x = false;
pparamsEdited.crop.y = false;
pparamsEdited.crop.w = false;
pparamsEdited.crop.h = false;
pparamsEdited.coarse.rotate = false;
}
}
if (event==rtengine::EvAutoExp || event==rtengine::EvClip)
for (size_t i=0; i<selected.size(); i++) {