diff options
author | Campbell Barton <ideasman42@gmail.com> | 2019-07-04 14:15:18 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2019-07-04 14:15:18 +0300 |
commit | c497a7efabe73514cd051a02b0574e179b0efeb8 (patch) | |
tree | 4d51f44f1e66894b5725c48a890e6dd8e232c5fe /source/blender/imbuf | |
parent | b2e3f23bec156dfceab98032d35b761288976368 (diff) |
ImBuf: add crop function (move out of screendump.c)
Diffstat (limited to 'source/blender/imbuf')
-rw-r--r-- | source/blender/imbuf/IMB_imbuf.h | 3 | ||||
-rw-r--r-- | source/blender/imbuf/intern/rectop.c | 69 |
2 files changed, 72 insertions, 0 deletions
diff --git a/source/blender/imbuf/IMB_imbuf.h b/source/blender/imbuf/IMB_imbuf.h index 8574f33bce6..fbaa9b06d3b 100644 --- a/source/blender/imbuf/IMB_imbuf.h +++ b/source/blender/imbuf/IMB_imbuf.h @@ -67,6 +67,7 @@ * \attention defined in ??? */ struct ImBuf; +struct rcti; /** * @@ -222,6 +223,8 @@ void IMB_blend_color_byte(unsigned char dst[4], IMB_BlendMode mode); void IMB_blend_color_float(float dst[4], float src1[4], float src2[4], IMB_BlendMode mode); +void IMB_rect_crop(struct ImBuf *ibuf, const struct rcti *crop); + void IMB_rectclip(struct ImBuf *dbuf, struct ImBuf *sbuf, int *destx, diff --git a/source/blender/imbuf/intern/rectop.c b/source/blender/imbuf/intern/rectop.c index 25390b73737..76918c216f7 100644 --- a/source/blender/imbuf/intern/rectop.c +++ b/source/blender/imbuf/intern/rectop.c @@ -25,6 +25,7 @@ #include <stdlib.h> #include "BLI_utildefines.h" +#include "BLI_rect.h" #include "BLI_math_base.h" #include "BLI_math_color.h" #include "BLI_math_color_blend.h" @@ -35,6 +36,8 @@ #include "IMB_colormanagement.h" +#include "MEM_guardedalloc.h" + void IMB_blend_color_byte(unsigned char dst[4], unsigned char src1[4], unsigned char src2[4], @@ -207,6 +210,72 @@ void IMB_blend_color_float(float dst[4], float src1[4], float src2[4], IMB_Blend } } +/** Crop */ + +static void rect_crop_4bytes(void **buf_p, const int size_src[2], const rcti *crop) +{ + if (*buf_p == NULL) { + return; + } + const int size_dst[2] = { + BLI_rcti_size_x(crop) + 1, + BLI_rcti_size_y(crop) + 1, + }; + uint *src = *buf_p; + uint *dst = src + crop->ymin * size_src[0] + crop->xmin; + for (int y = 0; y < size_dst[1]; y++, src += size_dst[0], dst += size_src[0]) { + memmove(src, dst, sizeof(uint) * size_dst[0]); + } + *buf_p = MEM_reallocN(*buf_p, sizeof(uint) * size_dst[0] * size_dst[1]); +} + +static void rect_crop_16bytes(void **buf_p, const int size_src[2], const rcti *crop) +{ + if (*buf_p == NULL) { + return; + } + const int size_dst[2] = { + BLI_rcti_size_x(crop) + 1, + BLI_rcti_size_y(crop) + 1, + }; + uint(*src)[4] = *buf_p; + uint(*dst)[4] = src + crop->ymin * size_src[0] + crop->xmin; + for (int y = 0; y < size_dst[1]; y++, src += size_dst[0], dst += size_src[0]) { + memmove(src, dst, sizeof(uint[4]) * size_dst[0]); + } + *buf_p = (void *)MEM_reallocN(*buf_p, sizeof(uint[4]) * size_dst[0] * size_dst[1]); +} + +/** + * In-place image crop. + */ +void IMB_rect_crop(ImBuf *ibuf, const rcti *crop) +{ + const int size_src[2] = { + ibuf->x, + ibuf->y, + }; + const int size_dst[2] = { + BLI_rcti_size_x(crop) + 1, + BLI_rcti_size_y(crop) + 1, + }; + BLI_assert(size_dst[0] > 0 && size_dst[0] > 0); + BLI_assert(crop->xmin >= 0 && crop->ymin >= 0); + BLI_assert(crop->xmax < ibuf->x && crop->ymax < ibuf->y); + + if ((size_dst[0] == ibuf->x) && (size_dst[1] == ibuf->y)) { + return; + } + + rect_crop_4bytes((void **)&ibuf->rect, size_src, crop); + rect_crop_4bytes((void **)&ibuf->zbuf, size_src, crop); + rect_crop_4bytes((void **)&ibuf->zbuf_float, size_src, crop); + rect_crop_16bytes((void **)&ibuf->rect_float, size_src, crop); + + ibuf->x = size_dst[0]; + ibuf->y = size_dst[1]; +} + /* clipping */ void IMB_rectclip(ImBuf *dbuf, |