Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2019-07-04 14:15:18 +0300
committerCampbell Barton <ideasman42@gmail.com>2019-07-04 14:15:18 +0300
commitc497a7efabe73514cd051a02b0574e179b0efeb8 (patch)
tree4d51f44f1e66894b5725c48a890e6dd8e232c5fe /source/blender
parentb2e3f23bec156dfceab98032d35b761288976368 (diff)
ImBuf: add crop function (move out of screendump.c)
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/editors/screen/screendump.c21
-rw-r--r--source/blender/imbuf/IMB_imbuf.h3
-rw-r--r--source/blender/imbuf/intern/rectop.c69
3 files changed, 74 insertions, 19 deletions
diff --git a/source/blender/editors/screen/screendump.c b/source/blender/editors/screen/screendump.c
index e5552314a6e..005c76d26b0 100644
--- a/source/blender/editors/screen/screendump.c
+++ b/source/blender/editors/screen/screendump.c
@@ -110,24 +110,6 @@ static void screenshot_data_free(wmOperator *op)
}
}
-static void screenshot_crop(ImBuf *ibuf, rcti crop)
-{
- unsigned int *to = ibuf->rect;
- unsigned int *from = ibuf->rect + crop.ymin * ibuf->x + crop.xmin;
- int crop_x = BLI_rcti_size_x(&crop);
- int crop_y = BLI_rcti_size_y(&crop);
- int y;
-
- if (crop_x > 0 && crop_y > 0) {
- for (y = 0; y < crop_y; y++, to += crop_x, from += ibuf->x) {
- memmove(to, from, sizeof(unsigned int) * crop_x);
- }
-
- ibuf->x = crop_x;
- ibuf->y = crop_y;
- }
-}
-
static int screenshot_exec(bContext *C, wmOperator *op)
{
ScreenshotData *scd = op->customdata;
@@ -153,7 +135,8 @@ static int screenshot_exec(bContext *C, wmOperator *op)
/* crop to show only single editor */
if (!RNA_boolean_get(op->ptr, "full")) {
- screenshot_crop(ibuf, scd->crop);
+ IMB_rect_crop(ibuf, &scd->crop);
+ scd->dumprect = ibuf->rect;
}
if (scd->im_format.planes == R_IMF_PLANES_BW) {
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,