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:
authorAnthony Edlin <akrashe@gmail.com>2013-11-25 16:40:58 +0400
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2013-11-25 17:26:45 +0400
commite626998a262ebe4f621b88eb09ece1a48c1a3ef8 (patch)
tree70a27361ecee4c639acf17d2c9c8cdde58c72689 /source/blender/editors/screen/screen_edit.c
parentab9822eff8865846d3c7ef81ff30cc35cb48ae0c (diff)
UI: fix errors in screen edge drawing, moving and region hiding.
Summary: - Fixes an off-by-one error in screen_test_scale() which causes the areas and regions to draw one pixel bigger on the right and top side of the window, therefor hiding one line of pixels. - Fixes an off-by-one error in rct_fits() which causes regions to incorrectly hide even though it would fit inside the area. - Correctly set the limits for the screen edge move operator so it will always go up to AREAMINX and headery. - Change screen_find_active_scredge() so it doesn't show the arrows cursor on the screen edges along the window border. The import thing to understand is how integer rects are used in this part of the code. They are constructed as a lower left and top right point and are INCLUSIVE. Meaning that if you have a rect's xmin = 10 and xmax = 30 then the total number of pixels is 21. So to get the size of a rect you have to do xmax - xmin + 1, which is easy to forget and result in off-by-one errors. Reviewed By: brecht Differential Revision: http://developer.blender.org/D41
Diffstat (limited to 'source/blender/editors/screen/screen_edit.c')
-rw-r--r--source/blender/editors/screen/screen_edit.c57
1 files changed, 35 insertions, 22 deletions
diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c
index 356db174c2f..474b9bc56fb 100644
--- a/source/blender/editors/screen/screen_edit.c
+++ b/source/blender/editors/screen/screen_edit.c
@@ -264,7 +264,8 @@ int scredge_is_horizontal(ScrEdge *se)
return (se->v1->vec.y == se->v2->vec.y);
}
-ScrEdge *screen_find_active_scredge(bScreen *sc, int mx, int my)
+/* need win size to make sure not to include edges along screen edge */
+ScrEdge *screen_find_active_scredge(bScreen *sc, int winsizex, int winsizey, int mx, int my)
{
ScrEdge *se;
int safety = U.widget_unit / 10;
@@ -273,20 +274,24 @@ ScrEdge *screen_find_active_scredge(bScreen *sc, int mx, int my)
for (se = sc->edgebase.first; se; se = se->next) {
if (scredge_is_horizontal(se)) {
- short min, max;
- min = MIN2(se->v1->vec.x, se->v2->vec.x);
- max = MAX2(se->v1->vec.x, se->v2->vec.x);
-
- if (abs(my - se->v1->vec.y) <= safety && mx >= min && mx <= max)
- return se;
+ if (se->v1->vec.y > 0 && se->v1->vec.y < winsizey - 1) {
+ short min, max;
+ min = MIN2(se->v1->vec.x, se->v2->vec.x);
+ max = MAX2(se->v1->vec.x, se->v2->vec.x);
+
+ if (abs(my - se->v1->vec.y) <= safety && mx >= min && mx <= max)
+ return se;
+ }
}
else {
- short min, max;
- min = MIN2(se->v1->vec.y, se->v2->vec.y);
- max = MAX2(se->v1->vec.y, se->v2->vec.y);
-
- if (abs(mx - se->v1->vec.x) <= safety && my >= min && my <= max)
- return se;
+ if (se->v1->vec.x > 0 && se->v1->vec.x < winsizex - 1) {
+ short min, max;
+ min = MIN2(se->v1->vec.y, se->v2->vec.y);
+ max = MAX2(se->v1->vec.y, se->v2->vec.y);
+
+ if (abs(mx - se->v1->vec.x) <= safety && my >= min && my <= max)
+ return se;
+ }
}
}
@@ -677,8 +682,8 @@ static void screen_test_scale(bScreen *sc, int winsizex, int winsizey)
sv->vec.y -= min[1];
}
- sizex = max[0] - min[0];
- sizey = max[1] - min[1];
+ sizex = max[0] - min[0] + 1;
+ sizey = max[1] - min[1] + 1;
if (sizex != winsizex || sizey != winsizey) {
facx = winsizex;
@@ -695,14 +700,14 @@ static void screen_test_scale(bScreen *sc, int winsizex, int winsizey)
//sv->vec.x += AREAGRID - 1;
//sv->vec.x -= (sv->vec.x % AREAGRID);
- CLAMP(sv->vec.x, 0, winsizex);
+ CLAMP(sv->vec.x, 0, winsizex - 1);
tempf = ((float)sv->vec.y) * facy;
sv->vec.y = (short)(tempf + 0.5f);
//sv->vec.y += AREAGRID - 1;
//sv->vec.y -= (sv->vec.y % AREAGRID);
- CLAMP(sv->vec.y, 0, winsizey);
+ CLAMP(sv->vec.y, 0, winsizey - 1);
}
}
@@ -711,9 +716,15 @@ static void screen_test_scale(bScreen *sc, int winsizex, int winsizey)
/* make each window at least ED_area_headersize() high */
for (sa = sc->areabase.first; sa; sa = sa->next) {
- int headery = ED_area_headersize() + U.pixelsize;
+ int headery = ED_area_headersize();
+
+ /* adjust headery if verts are along the edge of window */
+ if (sa->v1->vec.y > 0)
+ headery += U.pixelsize;
+ if (sa->v2->vec.y < winsizey - 1)
+ headery += U.pixelsize;
- if (sa->v1->vec.y + headery > sa->v2->vec.y) {
+ if (sa->v2->vec.y - sa->v1->vec.y + 1 < headery) {
/* lower edge */
ScrEdge *se = screen_findedge(sc, sa->v4, sa->v1);
if (se && sa->v1 != sa->v2) {
@@ -722,7 +733,7 @@ static void screen_test_scale(bScreen *sc, int winsizex, int winsizey)
select_connected_scredge(sc, se);
/* all selected vertices get the right offset */
- yval = sa->v2->vec.y - headery;
+ yval = sa->v2->vec.y - headery + 1;
sv = sc->vertbase.first;
while (sv) {
/* if is a collapsed area */
@@ -947,7 +958,7 @@ static void drawscredge_area(ScrArea *sa, int sizex, int sizey, int center)
if (U.pixelsize > 1.0f) {
glColor3ub(0x50, 0x50, 0x50);
- glLineWidth(1.5f * U.pixelsize);
+ glLineWidth((2.0f * U.pixelsize) - 1);
drawscredge_area_draw(sizex, sizey, x1, y1, x2, y2, 0);
glLineWidth(1.0f);
}
@@ -1247,6 +1258,8 @@ static void screen_cursor_set(wmWindow *win, wmEvent *event)
{
AZone *az = NULL;
ScrArea *sa;
+ int winsizex = WM_window_pixels_x(win);
+ int winsizey = WM_window_pixels_y(win);
for (sa = win->screen->areabase.first; sa; sa = sa->next)
if ((az = is_in_area_actionzone(sa, &event->x)))
@@ -1263,7 +1276,7 @@ static void screen_cursor_set(wmWindow *win, wmEvent *event)
}
}
else {
- ScrEdge *actedge = screen_find_active_scredge(win->screen, event->x, event->y);
+ ScrEdge *actedge = screen_find_active_scredge(win->screen, winsizex, winsizey, event->x, event->y);
if (actedge) {
if (scredge_is_horizontal(actedge))