/* 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; }
/* 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; }
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); }
/* 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; }