adding more zoom levels to the image editor

This commit is contained in:
Alberto Griggio
2017-03-16 14:33:26 +01:00
parent 3660ed5f95
commit feed87d046
3 changed files with 82 additions and 65 deletions

View File

@@ -34,38 +34,6 @@
using namespace rtengine;
struct ZoomStep {
Glib::ustring label;
double zoom;
int czoom;
};
ZoomStep zoomSteps[] = {
{" 1%", 0.01, 100},
{" 2%", 0.02, 50},
{" 5%", 0.05, 20},
{"6.7%", 1.0 / 15.0, 15},
{" 8%", 1.0 / 12.0, 12},
{" 10%", 0.1, 10},
{"12.5%", 0.125, 8},
{" 14%", 1.0 / 7.0, 7},
{"16.6%", 1.0 / 6.0, 6},
{" 20%", 0.2, 5},
{" 25%", 0.25, 4},
{" 33%", 1.0 / 3.0, 3},
{" 50%", 0.5, 2},
{"100%", 1.0, 1000},
{"200%", 2.0, 2000},
{"300%", 3.0, 3000},
{"400%", 4.0, 4000},
{"500%", 5.0, 5000},
{"600%", 6.0, 6000},
{"700%", 7.0, 7000},
{"800%", 8.0, 8000}
};
#define MAXZOOMSTEPS 20
#define ZOOM11INDEX 13
CropWindow::CropWindow (ImageArea* parent, bool isLowUpdatePriority_, bool isDetailWindow)
: ObjectMOBuffer(parent), state(SNormal), press_x(0), press_y(0), action_x(0), action_y(0), pickedObject(-1), pickModifierKey(0), rot_deg(0), onResizeArea(false), deleted(false),
fitZoomEnabled(true), fitZoom(false), isLowUpdatePriority(isLowUpdatePriority_), hoveredPicker(nullptr), cropLabel(Glib::ustring("100%")),
@@ -74,6 +42,8 @@ CropWindow::CropWindow (ImageArea* parent, bool isLowUpdatePriority_, bool isDet
imgX(-1), imgY(-1), imgW(1), imgH(1), iarea(parent), cropZoom(0), zoomVersion(0), exposeVersion(0), cropgl(nullptr),
pmlistener(nullptr), pmhlistener(nullptr), observedCropWin(nullptr)
{
initZoomSteps();
Glib::RefPtr<Pango::Context> context = parent->get_pango_context () ;
Pango::FontDescription fontd = context->get_font_description ();
fontd.set_weight (Pango::WEIGHT_BOLD);
@@ -120,6 +90,37 @@ CropWindow::~CropWindow ()
}
}
void CropWindow::initZoomSteps()
{
zoomSteps.push_back(ZoomStep(" 1%", 0.01, 999));
zoomSteps.push_back(ZoomStep(" 2%", 0.02, 500));
zoomSteps.push_back(ZoomStep(" 5%", 0.05, 200));
zoomSteps.push_back(ZoomStep(" 6%", 1.0/15.0, 150));
zoomSteps.push_back(ZoomStep(" 8%", 1.0/12.0, 120));
char lbl[64];
for (int s = 100; s >= 50; s -= 5) {
float z = 10./float(s);
sprintf(lbl, "% 2d%%", int(z * 100));
zoomSteps.push_back(ZoomStep(lbl, z, s));
}
for (int s = 45; s >= 27; s -= 3) {
float z = 10./float(s);
sprintf(lbl, "% 2d%%", int(z * 100));
zoomSteps.push_back(ZoomStep(lbl, z, s));
}
for (int s = 25; s >= 11; --s) {
float z = 10./float(s);
sprintf(lbl, "% 2d%%", int(z * 100));
zoomSteps.push_back(ZoomStep(lbl, z, s));
}
zoom11index = zoomSteps.size();
for (int s = 1; s <= 8; ++s) {
sprintf(lbl, "%d00", s);
zoomSteps.push_back(ZoomStep(lbl, s, s * 1000));
}
}
void CropWindow::enable()
{
cropHandler.setEnabled (true);
@@ -316,7 +317,7 @@ void CropWindow::buttonPress (int button, int type, int bstate, int x, int y)
state = SNormal;
zoomVersion = exposeVersion;
screenCoordToImage (x, y, action_x, action_y);
changeZoom (ZOOM11INDEX, true, action_x, action_y);
changeZoom (zoom11index, true, action_x, action_y);
fitZoom = false;
} else {
zoomFit ();
@@ -1967,7 +1968,7 @@ void CropWindow::zoom11 ()
zoomVersion = exposeVersion;
}
changeZoom (ZOOM11INDEX, true, x, y);
changeZoom (zoom11index, true, x, y);
fitZoom = false;
}
@@ -1984,17 +1985,17 @@ bool CropWindow::isMinZoom ()
bool CropWindow::isMaxZoom ()
{
return cropZoom >= MAXZOOMSTEPS;
return cropZoom >= int(zoomSteps.size())-1;
}
void CropWindow::setZoom (double zoom)
{
int cz = MAXZOOMSTEPS;
int cz = int(zoomSteps.size())-1;
if (zoom < zoomSteps[0].zoom) {
cz = 0;
} else
for (int i = 0; i < MAXZOOMSTEPS; i++)
for (int i = 0; i < int(zoomSteps.size())-1; i++)
if (zoomSteps[i].zoom <= zoom && zoomSteps[i + 1].zoom > zoom) {
cz = i;
break;
@@ -2006,12 +2007,12 @@ void CropWindow::setZoom (double zoom)
double CropWindow::getZoomFitVal ()
{
double z = cropHandler.getFitZoom ();
int cz = MAXZOOMSTEPS;
int cz = int(zoomSteps.size())-1;
if (z < zoomSteps[0].zoom) {
cz = 0;
} else
for (int i = 0; i < MAXZOOMSTEPS; i++)
for (int i = 0; i < int(zoomSteps.size())-1; i++)
if (zoomSteps[i].zoom <= z && zoomSteps[i + 1].zoom > z) {
cz = i;
break;
@@ -2025,12 +2026,12 @@ void CropWindow::zoomFit ()
{
double z = cropHandler.getFitZoom ();
int cz = MAXZOOMSTEPS;
int cz = int(zoomSteps.size())-1;
if (z < zoomSteps[0].zoom) {
cz = 0;
} else
for (int i = 0; i < MAXZOOMSTEPS; i++)
for (int i = 0; i < int(zoomSteps.size())-1; i++)
if (zoomSteps[i].zoom <= z && zoomSteps[i + 1].zoom > z) {
cz = i;
break;
@@ -2045,12 +2046,12 @@ void CropWindow::zoomFitCrop ()
{
if(cropHandler.cropParams.enabled) {
double z = cropHandler.getFitCropZoom ();
int cz = MAXZOOMSTEPS;
int cz = int(zoomSteps.size())-1;
if (z < zoomSteps[0].zoom) {
cz = 0;
} else
for (int i = 0; i < MAXZOOMSTEPS; i++)
for (int i = 0; i < int(zoomSteps.size())-1; i++)
if (zoomSteps[i].zoom <= z && zoomSteps[i + 1].zoom > z) {
cz = i;
break;
@@ -2125,8 +2126,8 @@ void CropWindow::changeZoom (int zoom, bool notify, int centerx, int centery)
if (zoom < 0) {
zoom = 0;
} else if (zoom > MAXZOOMSTEPS) {
zoom = MAXZOOMSTEPS;
} else if (zoom > int(zoomSteps.size())-1) {
zoom = int(zoomSteps.size())-1;
}
cropZoom = zoom;