static void draw_filled_lasso(wmWindow *win, wmGesture *gt) { const short *lasso = (short *)gt->customdata; const int tot = gt->points; int (*moves)[2] = MEM_mallocN(sizeof(*moves) * (tot + 1), __func__); int i; rcti rect; rcti rect_win; for (i = 0; i < tot; i++, lasso += 2) { moves[i][0] = lasso[0]; moves[i][1] = lasso[1]; } BLI_lasso_boundbox(&rect, (const int (*)[2])moves, tot); wm_subwindow_rect_get(win, gt->swinid, &rect_win); BLI_rcti_translate(&rect, rect_win.xmin, rect_win.ymin); BLI_rcti_isect(&rect_win, &rect, &rect); BLI_rcti_translate(&rect, -rect_win.xmin, -rect_win.ymin); /* highly unlikely this will fail, but could crash if (tot == 0) */ if (BLI_rcti_is_empty(&rect) == false) { const int w = BLI_rcti_size_x(&rect); const int h = BLI_rcti_size_y(&rect); unsigned int *pixel_buf = MEM_callocN(sizeof(*pixel_buf) * w * h, __func__); struct LassoFillData lasso_fill_data = {pixel_buf, w}; fill_poly_v2i_n( rect.xmin, rect.ymin, rect.xmax, rect.ymax, (const int (*)[2])moves, tot, draw_filled_lasso_px_cb, &lasso_fill_data); glEnable(GL_BLEND); // glColor4f(1.0, 1.0, 1.0, 0.05); glRasterPos2f(rect.xmin, rect.ymin); glDrawPixels(w, h, GL_RGBA, GL_UNSIGNED_BYTE, pixel_buf); glDisable(GL_BLEND); MEM_freeN(pixel_buf); } MEM_freeN(moves); }
/* nothing drawn here, we use it to store values */ static void preview_cb(ScrArea *sa, struct uiBlock *block) { SpaceImage *sima = sa->spacedata.first; rctf dispf; rcti *disprect = &G.scene->r.disprect; int winx = (G.scene->r.size * G.scene->r.xsch) / 100; int winy = (G.scene->r.size * G.scene->r.ysch) / 100; int mval[2]; if (G.scene->r.mode & R_BORDER) { winx *= BLI_rcti_size_x(&G.scene->r.border); winy *= BLI_rctf_size_y(&G.scene->r.border); } /* while dragging we need to update the rects, otherwise it doesn't end with correct one */ BLI_rctf_init(&dispf, 15.0f, BLI_rcti_size_x(&block->rect) - 15.0f, 15.0f, (BLI_rctf_size_y(&block->rect)) - 15.0f); ui_graphics_to_window_rct(sa->win, &dispf, disprect); /* correction for gla draw */ BLI_rcti_translate(disprect, -curarea->winrct.xmin, -curarea->winrct.ymin); calc_image_view(sima, 'p'); // printf("winrct %d %d %d %d\n", disprect->xmin, disprect->ymin, disprect->xmax, disprect->ymax); /* map to image space coordinates */ mval[0] = disprect->xmin; mval[1] = disprect->ymin; areamouseco_to_ipoco(v2d, mval, &dispf.xmin, &dispf.ymin); mval[0] = disprect->xmax; mval[1] = disprect->ymax; areamouseco_to_ipoco(v2d, mval, &dispf.xmax, &dispf.ymax); /* map to render coordinates */ disprect->xmin = dispf.xmin; disprect->xmax = dispf.xmax; disprect->ymin = dispf.ymin; disprect->ymax = dispf.ymax; CLAMP(disprect->xmin, 0, winx); CLAMP(disprect->xmax, 0, winx); CLAMP(disprect->ymin, 0, winy); CLAMP(disprect->ymax, 0, winy); // printf("drawrct %d %d %d %d\n", disprect->xmin, disprect->ymin, disprect->xmax, disprect->ymax); }
/** * Translate any popup regions (so we can drag them). */ void ui_popup_translate(ARegion *ar, const int mdiff[2]) { uiBlock *block; BLI_rcti_translate(&ar->winrct, UNPACK2(mdiff)); ED_region_update_rect(ar); ED_region_tag_redraw(ar); /* update blocks */ for (block = ar->uiblocks.first; block; block = block->next) { uiPopupBlockHandle *handle = block->handle; /* Make empty, will be initialized on next use, see T60608. */ BLI_rctf_init(&handle->prev_block_rect, 0, 0, 0, 0); uiSafetyRct *saferct; for (saferct = block->saferct.first; saferct; saferct = saferct->next) { BLI_rctf_translate(&saferct->parent, UNPACK2(mdiff)); BLI_rctf_translate(&saferct->safety, UNPACK2(mdiff)); } } }
void BLI_rcti_recenter(rcti *rect, int x, int y) { const int dx = x - BLI_rcti_cent_x(rect); const int dy = y - BLI_rcti_cent_y(rect); BLI_rcti_translate(rect, dx, dy); }