Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2005-04-24 15:57:23 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2005-04-24 15:57:23 +0400
commit0016d29b518f871bb88d9d9388b9a1d873b6d884 (patch)
tree5f43a5ac8393600a24fe0095836132e2cf3b43b0 /source/blender/src
parent6379ff9b7046e9286aaa117e98cdaa932480008c (diff)
Make view translation and zooming 'smooth' in the uv editor. Power-of-two
zoom levels can be found in the View > View Navigation menu. Also Ctrl+MMB zooming was added. Added the E-key, LSCM unwrap popup back again.
Diffstat (limited to 'source/blender/src')
-rw-r--r--source/blender/src/drawimage.c144
-rw-r--r--source/blender/src/header_image.c35
-rw-r--r--source/blender/src/space.c18
3 files changed, 121 insertions, 76 deletions
diff --git a/source/blender/src/drawimage.c b/source/blender/src/drawimage.c
index 6eda482f840..62604bc3f33 100644
--- a/source/blender/src/drawimage.c
+++ b/source/blender/src/drawimage.c
@@ -782,7 +782,7 @@ void drawimagespace(ScrArea *sa, void *spacedata)
ImBuf *ibuf= NULL;
float col[3];
unsigned int *rect;
- int x1, y1, xmin, xmax, ymin, ymax;
+ int x1, y1;
short sx, sy, dx, dy;
BIF_GetThemeColor3fv(TH_BACK, col);
@@ -792,9 +792,6 @@ void drawimagespace(ScrArea *sa, void *spacedata)
bwin_clear_viewmat(sa->win); /* clear buttons view */
glLoadIdentity();
- xmin= curarea->winrct.xmin; xmax= curarea->winrct.xmax;
- ymin= curarea->winrct.ymin; ymax= curarea->winrct.ymax;
-
what_image(G.sima);
if(G.sima->image) {
@@ -900,80 +897,104 @@ void drawimagespace(ScrArea *sa, void *spacedata)
curarea->win_swap= WIN_BACK_OK;
}
-void image_viewmove(void)
+static void image_zoom_power_of_two(void)
+{
+ /* Make zoom a power of 2 */
+
+ G.sima->zoom = 1 / G.sima->zoom;
+ G.sima->zoom = log(G.sima->zoom) / log(2);
+ G.sima->zoom = ceil(G.sima->zoom);
+ G.sima->zoom = pow(2, G.sima->zoom);
+ G.sima->zoom = 1 / G.sima->zoom;
+}
+
+static void image_zoom_set_factor(float zoomfac)
{
- short mval[2], mvalo[2], xof, yof;
+ SpaceImage *sima= curarea->spacedata.first;
+ int width, height;
+
+ if (zoomfac <= 0.0f)
+ return;
+
+ sima->zoom *= zoomfac;
+
+ if (sima->zoom > 0.1f && sima->zoom < 4.0f)
+ return;
+
+ /* check zoom limits */
+
+ calc_image_view(G.sima, 'p');
+ width= 256;
+ height= 256;
+ if (sima->image) {
+ if (sima->image->ibuf) {
+ width= sima->image->ibuf->x;
+ height= sima->image->ibuf->y;
+ }
+ }
+ width *= sima->zoom;
+ height *= sima->zoom;
+
+ if ((width < 4) && (height < 4))
+ sima->zoom /= zoomfac;
+ else if((curarea->winrct.xmax - curarea->winrct.xmin) <= sima->zoom)
+ sima->zoom /= zoomfac;
+ else if((curarea->winrct.ymax - curarea->winrct.ymin) <= sima->zoom)
+ sima->zoom /= zoomfac;
+}
+
+void image_viewmove(int mode)
+{
+ short mval[2], mvalo[2], zoom0;
getmouseco_sc(mvalo);
+ zoom0= G.sima->zoom;
while(get_mbut()&(L_MOUSE|M_MOUSE)) {
getmouseco_sc(mval);
+
+ if(mvalo[0]!=mval[0] || mvalo[1]!=mval[1]) {
- xof= (mvalo[0]-mval[0])/G.sima->zoom;
- yof= (mvalo[1]-mval[1])/G.sima->zoom;
-
- if(xof || yof) {
-
- G.sima->xof+= xof;
- G.sima->yof+= yof;
-
+ if(mode==0) {
+ G.sima->xof += (mvalo[0]-mval[0])/G.sima->zoom;
+ G.sima->yof += (mvalo[1]-mval[1])/G.sima->zoom;
+ }
+ else if (mode==1) {
+ float factor;
+
+ factor= 1.0+(float)(mvalo[0]-mval[0]+mvalo[1]-mval[1])/300.0;
+ image_zoom_set_factor(factor);
+ }
+
mvalo[0]= mval[0];
mvalo[1]= mval[1];
scrarea_do_windraw(curarea);
screen_swapbuffers();
- }
+ }
else BIF_wait_for_statechange();
}
}
-void image_viewzoom(unsigned short event)
+void image_viewzoom(unsigned short event, int invert)
{
SpaceImage *sima= curarea->spacedata.first;
- int width, height;
- if(U.uiflag & USER_WHEELZOOMDIR) {
- if (event==WHEELDOWNMOUSE || event == PADPLUSKEY) {
- sima->zoom *= 2;
- } else {
- sima->zoom /= 2;
- /* Check if the image will still be visible after zooming out */
- if (sima->zoom < 1) {
- calc_image_view(G.sima, 'p');
- if (sima->image) {
- if (sima->image->ibuf) {
- width = sima->image->ibuf->x * sima->zoom;
- height = sima->image->ibuf->y * sima->zoom;
- if ((width < 4) && (height < 4)) {
- /* Image will become too small, reset value */
- sima->zoom *= 2;
- }
- }
- }
- }
- }
- } else {
- if (event==WHEELUPMOUSE || event == PADPLUSKEY) {
- sima->zoom *= 2;
- } else {
- sima->zoom /= 2;
- /* Check if the image will still be visible after zooming out */
- if (sima->zoom < 1) {
- calc_image_view(G.sima, 'p');
- if (sima->image) {
- if (sima->image->ibuf) {
- width = sima->image->ibuf->x * sima->zoom;
- height = sima->image->ibuf->y * sima->zoom;
- if ((width < 4) && (height < 4)) {
- /* Image will become too small, reset value */
- sima->zoom *= 2;
- }
- }
- }
- }
- }
- }
+ if(event==WHEELDOWNMOUSE || event==PADMINUS)
+ image_zoom_set_factor((U.uiflag & USER_WHEELZOOMDIR)? 1.25: 0.8);
+ else if(event==WHEELUPMOUSE || event==PADPLUSKEY)
+ image_zoom_set_factor((U.uiflag & USER_WHEELZOOMDIR)? 0.8: 1.25);
+ else if(event==PAD1)
+ sima->zoom= 1.0;
+ else if(event==PAD2)
+ sima->zoom= (invert)? 2.0: 0.5;
+ else if(event==PAD4)
+ sima->zoom= (invert)? 4.0: 0.25;
+ else if(event==PAD8)
+ sima->zoom= (invert)? 8.0: 0.125;
+ else
+ return;
}
/**
@@ -1002,12 +1023,7 @@ void image_home(void)
zoomY = ((float)height) / ((float)G.sima->image->ibuf->y);
G.sima->zoom= MIN2(zoomX, zoomY);
- /* Now make it a power of 2 */
- G.sima->zoom = 1 / G.sima->zoom;
- G.sima->zoom = log(G.sima->zoom) / log(2);
- G.sima->zoom = ceil(G.sima->zoom);
- G.sima->zoom = pow(2, G.sima->zoom);
- G.sima->zoom = 1 / G.sima->zoom;
+ image_zoom_power_of_two();
}
else {
G.sima->zoom= (float)1;
diff --git a/source/blender/src/header_image.c b/source/blender/src/header_image.c
index 0bfae47a586..4e612aa3f13 100644
--- a/source/blender/src/header_image.c
+++ b/source/blender/src/header_image.c
@@ -351,10 +351,31 @@ static void do_image_view_viewnavmenu(void *arg, int event)
{
switch(event) {
case 1: /* Zoom In */
- image_viewzoom(PADPLUSKEY);
+ image_viewzoom(PADPLUSKEY, 0);
break;
case 2: /* Zoom Out */
- image_viewzoom(PADMINUS);
+ image_viewzoom(PADMINUS, 0);
+ break;
+ case 3: /* Zoom 8:1 */
+ image_viewzoom(PAD8, 0);
+ break;
+ case 4: /* Zoom 4:1 */
+ image_viewzoom(PAD4, 0);
+ break;
+ case 5: /* Zoom 2:1 */
+ image_viewzoom(PAD2, 0);
+ break;
+ case 6: /* Zoom 1:1 */
+ image_viewzoom(PAD1, 0);
+ break;
+ case 7: /* Zoom 1:2 */
+ image_viewzoom(PAD2, 1);
+ break;
+ case 8: /* Zoom 1:4 */
+ image_viewzoom(PAD4, 1);
+ break;
+ case 9: /* Zoom 1:8 */
+ image_viewzoom(PAD8, 1);
break;
}
allqueue(REDRAWIMAGE, 0);
@@ -372,6 +393,16 @@ static uiBlock *image_view_viewnavmenu(void *arg_unused)
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Zoom In|NumPad +", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Zoom Out|NumPad -", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
+ uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Zoom 1:8", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Zoom 1:4", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Zoom 1:2", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Zoom 1:1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Zoom 2:1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 7, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Zoom 4:1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 8, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Zoom 8:1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 9, "");
+
uiBlockSetDirection(block, UI_RIGHT);
uiTextBoundsBlock(block, 50);
return block;
diff --git a/source/blender/src/space.c b/source/blender/src/space.c
index bde20a6048e..04f2687aa2b 100644
--- a/source/blender/src/space.c
+++ b/source/blender/src/space.c
@@ -3751,9 +3751,6 @@ static void winqreadimagespace(ScrArea *sa, void *spacedata, BWinEvent *evt)
if(G.qual & LR_SHIFTKEY) mouseco_to_curtile();
else gesture();
break;
- case MIDDLEMOUSE:
- image_viewmove();
- break;
case RIGHTMOUSE:
if(G.f & G_FACESELECT)
mouse_select_sima();
@@ -3779,7 +3776,8 @@ static void winqreadimagespace(ScrArea *sa, void *spacedata, BWinEvent *evt)
toggle_uv_select('f');
break;
case EKEY :
- unwrap_lscm();
+ if(okee("LSCM Unwrap"))
+ unwrap_lscm();
break;
case GKEY:
if((G.qual==0))
@@ -3865,13 +3863,13 @@ static void winqreadimagespace(ScrArea *sa, void *spacedata, BWinEvent *evt)
do_imagebuts(val); // drawimage.c
break;
case MIDDLEMOUSE:
- image_viewmove();
+ if((G.qual==LR_CTRLKEY) || ((U.flag & USER_TWOBUTTONMOUSE) && (G.qual==(LR_ALTKEY|LR_CTRLKEY))))
+ image_viewmove(1);
+ else
+ image_viewmove(0);
break;
- case WHEELUPMOUSE:
- case WHEELDOWNMOUSE:
- case PADPLUSKEY:
- case PADMINUS:
- image_viewzoom(event);
+ case WHEELUPMOUSE: case WHEELDOWNMOUSE: case PADPLUSKEY: case PADMINUS:
+ image_viewzoom(event, 0);
scrarea_queue_winredraw(curarea);
break;
case HOMEKEY: