예제 #1
0
/* reading a stereo encoded ibuf (*left) and generating two ibufs from it (*left and *right) */
void IMB_ImBufFromStereo3d(
        Stereo3dFormat *s3d, ImBuf *ibuf_stereo3d,
        ImBuf **r_ibuf_left, ImBuf **r_ibuf_right)
{
	Stereo3DData s3d_data = {{NULL}};
	ImBuf *ibuf_left, *ibuf_right;
	size_t width, height;
	const bool is_float = (ibuf_stereo3d->rect_float != NULL);

	IMB_stereo3d_read_dimensions(
	        s3d->display_mode, ((s3d->flag & S3D_SQUEEZED_FRAME) == 0), ibuf_stereo3d->x, ibuf_stereo3d->y,
	        &width, &height);

	ibuf_left = IMB_allocImBuf(width, height, ibuf_stereo3d->planes, (is_float ? IB_rectfloat : IB_rect));
	ibuf_right = IMB_allocImBuf(width, height, ibuf_stereo3d->planes, (is_float ? IB_rectfloat : IB_rect));

	/* copy flags for IB_fields and other settings */
	ibuf_left->flags = ibuf_stereo3d->flags;
	ibuf_right->flags = ibuf_stereo3d->flags;

	/* we always work with unsqueezed formats */
	IMB_stereo3d_write_dimensions(
	        s3d->display_mode, ((s3d->flag & S3D_SQUEEZED_FRAME) == 0), ibuf_stereo3d->x, ibuf_stereo3d->y,
	        &width, &height);
	imb_stereo3d_unsqueeze_ImBuf(ibuf_stereo3d, s3d, width, height);

	imb_stereo3d_data_initialize(
	        &s3d_data, is_float, ibuf_left->x, ibuf_left->y, 4,
	        (int *)ibuf_left->rect, (int *)ibuf_right->rect, (int *)ibuf_stereo3d->rect,
	        ibuf_left->rect_float, ibuf_right->rect_float, ibuf_stereo3d->rect_float);

	imb_stereo3d_read_doit(&s3d_data, s3d);

	if (ibuf_stereo3d->flags & (IB_zbuf | IB_zbuffloat)) {
		if (is_float) {
			addzbuffloatImBuf(ibuf_left);
			addzbuffloatImBuf(ibuf_right);
		}
		else {
			addzbufImBuf(ibuf_left);
			addzbufImBuf(ibuf_right);
		}

		imb_stereo3d_data_initialize(
		        &s3d_data, is_float, ibuf_left->x, ibuf_left->y, 1,
		        (int *)ibuf_left->zbuf, (int *)ibuf_right->zbuf, (int *)ibuf_stereo3d->zbuf,
		        ibuf_left->zbuf_float, ibuf_right->zbuf_float, ibuf_stereo3d->zbuf_float);

		imb_stereo3d_read_doit(&s3d_data, s3d);
	}

	IMB_freeImBuf(ibuf_stereo3d);

	*r_ibuf_left = ibuf_left;
	*r_ibuf_right = ibuf_right;
}
예제 #2
0
/* question; why also add zbuf? */
bool imb_addrectImBuf(ImBuf *ibuf)
{
    size_t size;

    if (ibuf == NULL) return false;

    /* don't call imb_freerectImBuf, it frees mipmaps, this call is used only too give float buffers display */
    if (ibuf->rect && (ibuf->mall & IB_rect))
        MEM_freeN(ibuf->rect);
    ibuf->rect = NULL;

    size = (size_t)ibuf->x * (size_t)ibuf->y * sizeof(unsigned int);

    if ((ibuf->rect = MEM_mapallocN(size, __func__))) {
        ibuf->mall |= IB_rect;
        ibuf->flags |= IB_rect;
        if (ibuf->planes > 32) {
            return (addzbufImBuf(ibuf));
        }
        else {
            return true;
        }
    }

    return false;
}
예제 #3
0
ImBuf *IMB_allocImBuf(unsigned int x, unsigned int y, uchar planes, unsigned int flags)
{
	ImBuf *ibuf;

	ibuf = MEM_callocN(sizeof(ImBuf), "ImBuf_struct");

	if (ibuf) {
		ibuf->x = x;
		ibuf->y = y;
		ibuf->planes = planes;
		ibuf->ftype = IMB_FTYPE_PNG;
		ibuf->foptions.quality = 15; /* the 15 means, set compression to low ratio but not time consuming */
		ibuf->channels = 4;  /* float option, is set to other values when buffers get assigned */
		ibuf->ppm[0] = ibuf->ppm[1] = IMB_DPI_DEFAULT / 0.0254f; /* IMB_DPI_DEFAULT -> pixels-per-meter */

		if (flags & IB_rect) {
			if (imb_addrectImBuf(ibuf) == false) {
				IMB_freeImBuf(ibuf);
				return NULL;
			}
		}
		
		if (flags & IB_rectfloat) {
			if (imb_addrectfloatImBuf(ibuf) == false) {
				IMB_freeImBuf(ibuf);
				return NULL;
			}
		}
		
		if (flags & IB_zbuf) {
			if (addzbufImBuf(ibuf) == false) {
				IMB_freeImBuf(ibuf);
				return NULL;
			}
		}
		
		if (flags & IB_zbuffloat) {
			if (addzbuffloatImBuf(ibuf) == false) {
				IMB_freeImBuf(ibuf);
				return NULL;
			}
		}

		/* assign default spaces */
		colormanage_imbuf_set_default_spaces(ibuf);
	}
	return (ibuf);
}
예제 #4
0
/* question; why also add zbuf? */
bool imb_addrectImBuf(ImBuf *ibuf)
{
	if (ibuf == NULL) return false;

	/* don't call imb_freerectImBuf, it frees mipmaps, this call is used only too give float buffers display */
	if (ibuf->rect && (ibuf->mall & IB_rect))
		MEM_freeN(ibuf->rect);
	ibuf->rect = NULL;

	if ((ibuf->rect = imb_alloc_pixels(ibuf->x, ibuf->y, 4, sizeof(unsigned char), __func__))) {
		ibuf->mall |= IB_rect;
		ibuf->flags |= IB_rect;
		if (ibuf->planes > 32) {
			return (addzbufImBuf(ibuf));
		}
		else {
			return true;
		}
	}

	return false;
}