75 const ScrAreaMap *area_map,
const rcti *bounds_rect,
const int mx,
const int my,
int safety)
81 if ((se->v1->vec.y > bounds_rect->
ymin) && (se->v1->vec.y < (bounds_rect->
ymax - 1))) {
83 min = std::min(se->v1->vec.x, se->v2->vec.x);
84 max = std::max(se->v1->vec.x, se->v2->vec.x);
86 if (
abs(my - se->v1->vec.y) <= safety && mx >=
min && mx <=
max) {
92 if ((se->v1->vec.x > bounds_rect->
xmin) && (se->v1->vec.x < (bounds_rect->
xmax - 1))) {
94 min = std::min(se->v1->vec.y, se->v2->vec.y);
95 max = std::max(se->v1->vec.y, se->v2->vec.y);
97 if (
abs(mx - se->v1->vec.x) <= safety && my >=
min && my <=
max) {
138 const rcti *screen_rect)
143 bool needs_another_pass =
false;
146 float min[2] = {20000.0f, 20000.0f};
147 float max[2] = {0.0f, 0.0f};
150 const float fv[2] = {
float(sv->vec.x),
float(sv->vec.y)};
154 int screen_size_x_prev = (
max[0] -
min[0]) + 1;
155 int screen_size_y_prev = (
max[1] -
min[1]) + 1;
157 if (screen_size_x_prev != screen_size_x || screen_size_y_prev != screen_size_y) {
158 const float facx = (
float(screen_size_x) - 1) / (
float(screen_size_x_prev) - 1);
159 const float facy = (
float(screen_size_y) - 1) / (
float(screen_size_y_prev) - 1);
178 if (area->v1->vec.y > screen_rect->
ymin) {
181 if (area->spacetype ==
SPACE_ACTION && area->v1->vec.y == screen_rect->
ymin &&
186 const int yval = area->v1->vec.y +
min - 1;
193 if (!
ELEM(sv, area->v1, area->v4)) {
197 needs_another_pass =
true;
213 if (area->v3->vec.y >= (screen_rect->
ymax - 1)) {
217 else if (area->v4->vec.y <= (screen_rect->
ymin + 1)) {
226 if (se && area->
v1 != area->v2) {
227 const int yval = area->v2->vec.y -
min;
234 if (!
ELEM(sv, area->v2, area->v3)) {
238 needs_another_pass =
true;
247 return needs_another_pass;
252 rcti window_rect, screen_rect;
256 bool needs_another_pass;
257 int max_passes_left = 10;
261 }
while (needs_another_pass && (max_passes_left > 0));
272 if (area->v1->vec.y > window_rect.
ymin) {
273 height +=
U.pixelsize;
275 if (area->v2->vec.y < (window_rect.
ymax - 1)) {
276 height +=
U.pixelsize;
280 area->v1->vec.x = area->v2->vec.x = window_rect.
xmin;
281 area->v3->vec.x = area->v4->vec.x = window_rect.
xmax - 1;
283 area->v1->vec.y = area->v4->vec.y = window_rect.
ymin;
284 area->v2->vec.y = area->v3->vec.y = window_rect.
ymax - 1;
286 switch (area->global->align) {
288 area->v1->vec.y = area->v4->vec.y = area->v2->vec.y - height;
291 area->v2->vec.y = area->v3->vec.y = area->v1->vec.y + height;
298 const rcti *window_rect,
309 if (cur_area_width <= 2 * area_min_x) {
314 if (cur_area_height <= 2 * area_min_y) {
320 CLAMP(fac, 0.0f, 1.0f);
325 int area_min = area_min_y;
328 area_min +=
U.pixelsize;
330 if (area->
v2->
vec.
y < (window_rect->
ymax - 1)) {
331 area_min +=
U.pixelsize;
334 if (
y - area->
v1->
vec.
y < area_min) {
335 y = area->
v1->
vec.
y + area_min;
337 else if (area->
v2->
vec.
y -
y < area_min) {
338 y = area->
v2->
vec.
y - area_min;
346 int area_min = area_min_x;
349 area_min +=
U.pixelsize;
351 if (area->
v4->
vec.
x < (window_rect->
xmax - 1)) {
352 area_min +=
U.pixelsize;
355 if (
x - area->
v1->
vec.
x < area_min) {
356 x = area->
v1->
vec.
x + area_min;
358 else if (area->
v4->
vec.
x -
x < area_min) {
359 x = area->
v4->
vec.
x - area_min;
387 bool oneselected =
true;
388 while (oneselected) {
391 if (se->v1->flag + se->v2->flag == 1) {
393 if (se->v1->vec.y == se->v2->vec.y) {
394 se->v1->flag = se->v2->flag = 1;
399 if (se->v1->vec.x == se->v2->vec.x) {
400 se->v1->flag = se->v2->flag = 1;
void BKE_screen_sort_scrvert(ScrVert **v1, ScrVert **v2)
ScrEdge * BKE_screen_find_edge(const bScreen *screen, ScrVert *v1, ScrVert *v2)
#define LISTBASE_FOREACH(type, var, list)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
MINLINE short round_fl_to_short(float a)
void minmax_v2v2_v2(float min[2], float max[2], const float vec[2])
BLI_INLINE int BLI_rcti_size_y(const struct rcti *rct)
BLI_INLINE int BLI_rcti_size_x(const struct rcti *rct)
#define AREAMAP_FROM_SCREEN(screen)
@ GLOBAL_AREA_ALIGN_BOTTOM
@ USER_APP_LOCK_EDGE_RESIZE
int ED_area_global_size_y(const ScrArea *area)
#define ED_screen_verts_iter(win, screen, vert_name)
Read Guarded memory(de)allocation.
ATTR_WARN_UNUSED_RESULT const BMVert * v2
void * MEM_callocN(size_t len, const char *str)
ScrVert * screen_geom_vertex_add(bScreen *screen, short x, short y)
ScrEdge * screen_geom_edge_add_ex(ScrAreaMap *area_map, ScrVert *v1, ScrVert *v2)
ScrVert * screen_geom_vertex_add_ex(ScrAreaMap *area_map, short x, short y)
ScrEdge * screen_geom_find_active_scredge(const wmWindow *win, const bScreen *screen, const int mx, const int my)
ScrEdge * screen_geom_edge_add(bScreen *screen, ScrVert *v1, ScrVert *v2)
void screen_geom_select_connected_edge(const wmWindow *win, ScrEdge *edge)
bool screen_geom_edge_is_horizontal(ScrEdge *se)
static bool screen_geom_vertices_scale_pass(const wmWindow *win, const bScreen *screen, const rcti *screen_rect)
int screen_geom_area_width(const ScrArea *area)
ScrEdge * screen_geom_area_map_find_active_scredge(const ScrAreaMap *area_map, const rcti *bounds_rect, const int mx, const int my, int safety)
int screen_geom_area_height(const ScrArea *area)
void screen_geom_vertices_scale(const wmWindow *win, bScreen *screen)
Main screen-layout calculation function.
short screen_geom_find_area_split_point(const ScrArea *area, const rcti *window_rect, const eScreenAxis dir_axis, float fac)
#define BORDERPADDING_GLOBAL
void WM_window_rect_calc(const wmWindow *win, rcti *r_rect)
void WM_window_screen_rect_calc(const wmWindow *win, rcti *r_rect)
bScreen * WM_window_get_active_screen(const wmWindow *win)