Example #1
0
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);
}
Example #2
0
/* 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));
    }
  }
}
Example #4
0
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);
}