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-04-17 07:17:24 +0300
committerCampbell Barton <ideasman42@gmail.com>2019-04-17 07:21:24 +0300
commite12c08e8d170b7ca40f204a5b0423c23a9fbc2c1 (patch)
tree8cf3453d12edb177a218ef8009357518ec6cab6a /source/blender/imbuf/intern/rectop.c
parentb3dabc200a4b0399ec6b81f2ff2730d07b44fcaa (diff)
ClangFormat: apply to source, most of intern
Apply clang format as proposed in T53211. For details on usage and instructions for migrating branches without conflicts, see: https://wiki.blender.org/wiki/Tools/ClangFormat
Diffstat (limited to 'source/blender/imbuf/intern/rectop.c')
-rw-r--r--source/blender/imbuf/intern/rectop.c1845
1 files changed, 1007 insertions, 838 deletions
diff --git a/source/blender/imbuf/intern/rectop.c b/source/blender/imbuf/intern/rectop.c
index ef869e35a36..a069e79b337 100644
--- a/source/blender/imbuf/intern/rectop.c
+++ b/source/blender/imbuf/intern/rectop.c
@@ -35,890 +35,1059 @@
#include "IMB_colormanagement.h"
-void IMB_blend_color_byte(unsigned char dst[4], unsigned char src1[4], unsigned char src2[4], IMB_BlendMode mode)
+void IMB_blend_color_byte(unsigned char dst[4],
+ unsigned char src1[4],
+ unsigned char src2[4],
+ IMB_BlendMode mode)
{
- switch (mode) {
- case IMB_BLEND_MIX:
- blend_color_mix_byte(dst, src1, src2); break;
- case IMB_BLEND_ADD:
- blend_color_add_byte(dst, src1, src2); break;
- case IMB_BLEND_SUB:
- blend_color_sub_byte(dst, src1, src2); break;
- case IMB_BLEND_MUL:
- blend_color_mul_byte(dst, src1, src2); break;
- case IMB_BLEND_LIGHTEN:
- blend_color_lighten_byte(dst, src1, src2); break;
- case IMB_BLEND_DARKEN:
- blend_color_darken_byte(dst, src1, src2); break;
- case IMB_BLEND_ERASE_ALPHA:
- blend_color_erase_alpha_byte(dst, src1, src2); break;
- case IMB_BLEND_ADD_ALPHA:
- blend_color_add_alpha_byte(dst, src1, src2); break;
- case IMB_BLEND_OVERLAY:
- blend_color_overlay_byte(dst, src1, src2); break;
- case IMB_BLEND_HARDLIGHT:
- blend_color_hardlight_byte(dst, src1, src2); break;
- case IMB_BLEND_COLORBURN:
- blend_color_burn_byte(dst, src1, src2); break;
- case IMB_BLEND_LINEARBURN:
- blend_color_linearburn_byte(dst, src1, src2); break;
- case IMB_BLEND_COLORDODGE:
- blend_color_dodge_byte(dst, src1, src2); break;
- case IMB_BLEND_SCREEN:
- blend_color_screen_byte(dst, src1, src2); break;
- case IMB_BLEND_SOFTLIGHT:
- blend_color_softlight_byte(dst, src1, src2); break;
- case IMB_BLEND_PINLIGHT:
- blend_color_pinlight_byte(dst, src1, src2); break;
- case IMB_BLEND_LINEARLIGHT:
- blend_color_linearlight_byte(dst, src1, src2); break;
- case IMB_BLEND_VIVIDLIGHT:
- blend_color_vividlight_byte(dst, src1, src2); break;
- case IMB_BLEND_DIFFERENCE:
- blend_color_difference_byte(dst, src1, src2); break;
- case IMB_BLEND_EXCLUSION:
- blend_color_exclusion_byte(dst, src1, src2); break;
- case IMB_BLEND_COLOR:
- blend_color_color_byte(dst, src1, src2); break;
- case IMB_BLEND_HUE:
- blend_color_hue_byte(dst, src1, src2); break;
- case IMB_BLEND_SATURATION:
- blend_color_saturation_byte(dst, src1, src2); break;
- case IMB_BLEND_LUMINOSITY:
- blend_color_luminosity_byte(dst, src1, src2); break;
-
- default:
- dst[0] = src1[0];
- dst[1] = src1[1];
- dst[2] = src1[2];
- dst[3] = src1[3];
- break;
- }
+ switch (mode) {
+ case IMB_BLEND_MIX:
+ blend_color_mix_byte(dst, src1, src2);
+ break;
+ case IMB_BLEND_ADD:
+ blend_color_add_byte(dst, src1, src2);
+ break;
+ case IMB_BLEND_SUB:
+ blend_color_sub_byte(dst, src1, src2);
+ break;
+ case IMB_BLEND_MUL:
+ blend_color_mul_byte(dst, src1, src2);
+ break;
+ case IMB_BLEND_LIGHTEN:
+ blend_color_lighten_byte(dst, src1, src2);
+ break;
+ case IMB_BLEND_DARKEN:
+ blend_color_darken_byte(dst, src1, src2);
+ break;
+ case IMB_BLEND_ERASE_ALPHA:
+ blend_color_erase_alpha_byte(dst, src1, src2);
+ break;
+ case IMB_BLEND_ADD_ALPHA:
+ blend_color_add_alpha_byte(dst, src1, src2);
+ break;
+ case IMB_BLEND_OVERLAY:
+ blend_color_overlay_byte(dst, src1, src2);
+ break;
+ case IMB_BLEND_HARDLIGHT:
+ blend_color_hardlight_byte(dst, src1, src2);
+ break;
+ case IMB_BLEND_COLORBURN:
+ blend_color_burn_byte(dst, src1, src2);
+ break;
+ case IMB_BLEND_LINEARBURN:
+ blend_color_linearburn_byte(dst, src1, src2);
+ break;
+ case IMB_BLEND_COLORDODGE:
+ blend_color_dodge_byte(dst, src1, src2);
+ break;
+ case IMB_BLEND_SCREEN:
+ blend_color_screen_byte(dst, src1, src2);
+ break;
+ case IMB_BLEND_SOFTLIGHT:
+ blend_color_softlight_byte(dst, src1, src2);
+ break;
+ case IMB_BLEND_PINLIGHT:
+ blend_color_pinlight_byte(dst, src1, src2);
+ break;
+ case IMB_BLEND_LINEARLIGHT:
+ blend_color_linearlight_byte(dst, src1, src2);
+ break;
+ case IMB_BLEND_VIVIDLIGHT:
+ blend_color_vividlight_byte(dst, src1, src2);
+ break;
+ case IMB_BLEND_DIFFERENCE:
+ blend_color_difference_byte(dst, src1, src2);
+ break;
+ case IMB_BLEND_EXCLUSION:
+ blend_color_exclusion_byte(dst, src1, src2);
+ break;
+ case IMB_BLEND_COLOR:
+ blend_color_color_byte(dst, src1, src2);
+ break;
+ case IMB_BLEND_HUE:
+ blend_color_hue_byte(dst, src1, src2);
+ break;
+ case IMB_BLEND_SATURATION:
+ blend_color_saturation_byte(dst, src1, src2);
+ break;
+ case IMB_BLEND_LUMINOSITY:
+ blend_color_luminosity_byte(dst, src1, src2);
+ break;
+
+ default:
+ dst[0] = src1[0];
+ dst[1] = src1[1];
+ dst[2] = src1[2];
+ dst[3] = src1[3];
+ break;
+ }
}
void IMB_blend_color_float(float dst[4], float src1[4], float src2[4], IMB_BlendMode mode)
{
- switch (mode) {
- case IMB_BLEND_MIX:
- blend_color_mix_float(dst, src1, src2); break;
- case IMB_BLEND_ADD:
- blend_color_add_float(dst, src1, src2); break;
- case IMB_BLEND_SUB:
- blend_color_sub_float(dst, src1, src2); break;
- case IMB_BLEND_MUL:
- blend_color_mul_float(dst, src1, src2); break;
- case IMB_BLEND_LIGHTEN:
- blend_color_lighten_float(dst, src1, src2); break;
- case IMB_BLEND_DARKEN:
- blend_color_darken_float(dst, src1, src2); break;
- case IMB_BLEND_ERASE_ALPHA:
- blend_color_erase_alpha_float(dst, src1, src2); break;
- case IMB_BLEND_ADD_ALPHA:
- blend_color_add_alpha_float(dst, src1, src2); break;
- case IMB_BLEND_OVERLAY:
- blend_color_overlay_float(dst, src1, src2); break;
- case IMB_BLEND_HARDLIGHT:
- blend_color_hardlight_float(dst, src1, src2); break;
- case IMB_BLEND_COLORBURN:
- blend_color_burn_float(dst, src1, src2); break;
- case IMB_BLEND_LINEARBURN:
- blend_color_linearburn_float(dst, src1, src2); break;
- case IMB_BLEND_COLORDODGE:
- blend_color_dodge_float(dst, src1, src2); break;
- case IMB_BLEND_SCREEN:
- blend_color_screen_float(dst, src1, src2); break;
- case IMB_BLEND_SOFTLIGHT:
- blend_color_softlight_float(dst, src1, src2); break;
- case IMB_BLEND_PINLIGHT:
- blend_color_pinlight_float(dst, src1, src2); break;
- case IMB_BLEND_LINEARLIGHT:
- blend_color_linearlight_float(dst, src1, src2); break;
- case IMB_BLEND_VIVIDLIGHT:
- blend_color_vividlight_float(dst, src1, src2); break;
- case IMB_BLEND_DIFFERENCE:
- blend_color_difference_float(dst, src1, src2); break;
- case IMB_BLEND_EXCLUSION:
- blend_color_exclusion_float(dst, src1, src2); break;
- case IMB_BLEND_COLOR:
- blend_color_color_float(dst, src1, src2); break;
- case IMB_BLEND_HUE:
- blend_color_hue_float(dst, src1, src2); break;
- case IMB_BLEND_SATURATION:
- blend_color_saturation_float(dst, src1, src2); break;
- case IMB_BLEND_LUMINOSITY:
- blend_color_luminosity_float(dst, src1, src2); break;
- default:
- dst[0] = src1[0];
- dst[1] = src1[1];
- dst[2] = src1[2];
- dst[3] = src1[3];
- break;
- }
+ switch (mode) {
+ case IMB_BLEND_MIX:
+ blend_color_mix_float(dst, src1, src2);
+ break;
+ case IMB_BLEND_ADD:
+ blend_color_add_float(dst, src1, src2);
+ break;
+ case IMB_BLEND_SUB:
+ blend_color_sub_float(dst, src1, src2);
+ break;
+ case IMB_BLEND_MUL:
+ blend_color_mul_float(dst, src1, src2);
+ break;
+ case IMB_BLEND_LIGHTEN:
+ blend_color_lighten_float(dst, src1, src2);
+ break;
+ case IMB_BLEND_DARKEN:
+ blend_color_darken_float(dst, src1, src2);
+ break;
+ case IMB_BLEND_ERASE_ALPHA:
+ blend_color_erase_alpha_float(dst, src1, src2);
+ break;
+ case IMB_BLEND_ADD_ALPHA:
+ blend_color_add_alpha_float(dst, src1, src2);
+ break;
+ case IMB_BLEND_OVERLAY:
+ blend_color_overlay_float(dst, src1, src2);
+ break;
+ case IMB_BLEND_HARDLIGHT:
+ blend_color_hardlight_float(dst, src1, src2);
+ break;
+ case IMB_BLEND_COLORBURN:
+ blend_color_burn_float(dst, src1, src2);
+ break;
+ case IMB_BLEND_LINEARBURN:
+ blend_color_linearburn_float(dst, src1, src2);
+ break;
+ case IMB_BLEND_COLORDODGE:
+ blend_color_dodge_float(dst, src1, src2);
+ break;
+ case IMB_BLEND_SCREEN:
+ blend_color_screen_float(dst, src1, src2);
+ break;
+ case IMB_BLEND_SOFTLIGHT:
+ blend_color_softlight_float(dst, src1, src2);
+ break;
+ case IMB_BLEND_PINLIGHT:
+ blend_color_pinlight_float(dst, src1, src2);
+ break;
+ case IMB_BLEND_LINEARLIGHT:
+ blend_color_linearlight_float(dst, src1, src2);
+ break;
+ case IMB_BLEND_VIVIDLIGHT:
+ blend_color_vividlight_float(dst, src1, src2);
+ break;
+ case IMB_BLEND_DIFFERENCE:
+ blend_color_difference_float(dst, src1, src2);
+ break;
+ case IMB_BLEND_EXCLUSION:
+ blend_color_exclusion_float(dst, src1, src2);
+ break;
+ case IMB_BLEND_COLOR:
+ blend_color_color_float(dst, src1, src2);
+ break;
+ case IMB_BLEND_HUE:
+ blend_color_hue_float(dst, src1, src2);
+ break;
+ case IMB_BLEND_SATURATION:
+ blend_color_saturation_float(dst, src1, src2);
+ break;
+ case IMB_BLEND_LUMINOSITY:
+ blend_color_luminosity_float(dst, src1, src2);
+ break;
+ default:
+ dst[0] = src1[0];
+ dst[1] = src1[1];
+ dst[2] = src1[2];
+ dst[3] = src1[3];
+ break;
+ }
}
/* clipping */
-void IMB_rectclip(ImBuf *dbuf, ImBuf *sbuf, int *destx,
- int *desty, int *srcx, int *srcy, int *width, int *height)
+void IMB_rectclip(ImBuf *dbuf,
+ ImBuf *sbuf,
+ int *destx,
+ int *desty,
+ int *srcx,
+ int *srcy,
+ int *width,
+ int *height)
{
- int tmp;
-
- if (dbuf == NULL) return;
-
- if (*destx < 0) {
- *srcx -= *destx;
- *width += *destx;
- *destx = 0;
- }
- if (*srcx < 0) {
- *destx -= *srcx;
- *width += *srcx;
- *srcx = 0;
- }
- if (*desty < 0) {
- *srcy -= *desty;
- *height += *desty;
- *desty = 0;
- }
- if (*srcy < 0) {
- *desty -= *srcy;
- *height += *srcy;
- *srcy = 0;
- }
-
- tmp = dbuf->x - *destx;
- if (*width > tmp) *width = tmp;
- tmp = dbuf->y - *desty;
- if (*height > tmp) *height = tmp;
-
- if (sbuf) {
- tmp = sbuf->x - *srcx;
- if (*width > tmp) *width = tmp;
- tmp = sbuf->y - *srcy;
- if (*height > tmp) *height = tmp;
- }
-
- if ((*height <= 0) || (*width <= 0)) {
- *width = 0;
- *height = 0;
- }
+ int tmp;
+
+ if (dbuf == NULL)
+ return;
+
+ if (*destx < 0) {
+ *srcx -= *destx;
+ *width += *destx;
+ *destx = 0;
+ }
+ if (*srcx < 0) {
+ *destx -= *srcx;
+ *width += *srcx;
+ *srcx = 0;
+ }
+ if (*desty < 0) {
+ *srcy -= *desty;
+ *height += *desty;
+ *desty = 0;
+ }
+ if (*srcy < 0) {
+ *desty -= *srcy;
+ *height += *srcy;
+ *srcy = 0;
+ }
+
+ tmp = dbuf->x - *destx;
+ if (*width > tmp)
+ *width = tmp;
+ tmp = dbuf->y - *desty;
+ if (*height > tmp)
+ *height = tmp;
+
+ if (sbuf) {
+ tmp = sbuf->x - *srcx;
+ if (*width > tmp)
+ *width = tmp;
+ tmp = sbuf->y - *srcy;
+ if (*height > tmp)
+ *height = tmp;
+ }
+
+ if ((*height <= 0) || (*width <= 0)) {
+ *width = 0;
+ *height = 0;
+ }
}
-static void imb_rectclip3(ImBuf *dbuf, ImBuf *obuf, ImBuf *sbuf, int *destx,
- int *desty, int *origx, int *origy, int *srcx, int *srcy,
- int *width, int *height)
+static void imb_rectclip3(ImBuf *dbuf,
+ ImBuf *obuf,
+ ImBuf *sbuf,
+ int *destx,
+ int *desty,
+ int *origx,
+ int *origy,
+ int *srcx,
+ int *srcy,
+ int *width,
+ int *height)
{
- int tmp;
-
- if (dbuf == NULL) return;
-
- if (*destx < 0) {
- *srcx -= *destx;
- *origx -= *destx;
- *width += *destx;
- *destx = 0;
- }
- if (*origx < 0) {
- *destx -= *origx;
- *srcx -= *origx;
- *width += *origx;
- *origx = 0;
- }
- if (*srcx < 0) {
- *destx -= *srcx;
- *origx -= *srcx;
- *width += *srcx;
- *srcx = 0;
- }
-
- if (*desty < 0) {
- *srcy -= *desty;
- *origy -= *desty;
- *height += *desty;
- *desty = 0;
- }
- if (*origy < 0) {
- *desty -= *origy;
- *srcy -= *origy;
- *height += *origy;
- *origy = 0;
- }
- if (*srcy < 0) {
- *desty -= *srcy;
- *origy -= *srcy;
- *height += *srcy;
- *srcy = 0;
- }
-
- tmp = dbuf->x - *destx;
- if (*width > tmp) *width = tmp;
- tmp = dbuf->y - *desty;
- if (*height > tmp) *height = tmp;
-
- if (obuf) {
- tmp = obuf->x - *origx;
- if (*width > tmp) *width = tmp;
- tmp = obuf->y - *origy;
- if (*height > tmp) *height = tmp;
- }
-
- if (sbuf) {
- tmp = sbuf->x - *srcx;
- if (*width > tmp) *width = tmp;
- tmp = sbuf->y - *srcy;
- if (*height > tmp) *height = tmp;
- }
-
- if ((*height <= 0) || (*width <= 0)) {
- *width = 0;
- *height = 0;
- }
+ int tmp;
+
+ if (dbuf == NULL)
+ return;
+
+ if (*destx < 0) {
+ *srcx -= *destx;
+ *origx -= *destx;
+ *width += *destx;
+ *destx = 0;
+ }
+ if (*origx < 0) {
+ *destx -= *origx;
+ *srcx -= *origx;
+ *width += *origx;
+ *origx = 0;
+ }
+ if (*srcx < 0) {
+ *destx -= *srcx;
+ *origx -= *srcx;
+ *width += *srcx;
+ *srcx = 0;
+ }
+
+ if (*desty < 0) {
+ *srcy -= *desty;
+ *origy -= *desty;
+ *height += *desty;
+ *desty = 0;
+ }
+ if (*origy < 0) {
+ *desty -= *origy;
+ *srcy -= *origy;
+ *height += *origy;
+ *origy = 0;
+ }
+ if (*srcy < 0) {
+ *desty -= *srcy;
+ *origy -= *srcy;
+ *height += *srcy;
+ *srcy = 0;
+ }
+
+ tmp = dbuf->x - *destx;
+ if (*width > tmp)
+ *width = tmp;
+ tmp = dbuf->y - *desty;
+ if (*height > tmp)
+ *height = tmp;
+
+ if (obuf) {
+ tmp = obuf->x - *origx;
+ if (*width > tmp)
+ *width = tmp;
+ tmp = obuf->y - *origy;
+ if (*height > tmp)
+ *height = tmp;
+ }
+
+ if (sbuf) {
+ tmp = sbuf->x - *srcx;
+ if (*width > tmp)
+ *width = tmp;
+ tmp = sbuf->y - *srcy;
+ if (*height > tmp)
+ *height = tmp;
+ }
+
+ if ((*height <= 0) || (*width <= 0)) {
+ *width = 0;
+ *height = 0;
+ }
}
/* copy and blend */
-void IMB_rectcpy(ImBuf *dbuf, ImBuf *sbuf, int destx,
- int desty, int srcx, int srcy, int width, int height)
+void IMB_rectcpy(
+ ImBuf *dbuf, ImBuf *sbuf, int destx, int desty, int srcx, int srcy, int width, int height)
{
- IMB_rectblend(dbuf, dbuf, sbuf, NULL, NULL, NULL, 0, destx, desty, destx, desty, srcx, srcy, width, height, IMB_BLEND_COPY, false);
+ IMB_rectblend(dbuf,
+ dbuf,
+ sbuf,
+ NULL,
+ NULL,
+ NULL,
+ 0,
+ destx,
+ desty,
+ destx,
+ desty,
+ srcx,
+ srcy,
+ width,
+ height,
+ IMB_BLEND_COPY,
+ false);
}
-typedef void (*IMB_blend_func)(unsigned char *dst, const unsigned char *src1, const unsigned char *src2);
+typedef void (*IMB_blend_func)(unsigned char *dst,
+ const unsigned char *src1,
+ const unsigned char *src2);
typedef void (*IMB_blend_func_float)(float *dst, const float *src1, const float *src2);
-
-void IMB_rectblend(ImBuf *dbuf, ImBuf *obuf, ImBuf *sbuf, unsigned short *dmask, unsigned short *curvemask,
- unsigned short *texmask, float mask_max,
- int destx, int desty, int origx, int origy, int srcx, int srcy, int width, int height,
- IMB_BlendMode mode, bool accumulate)
+void IMB_rectblend(ImBuf *dbuf,
+ ImBuf *obuf,
+ ImBuf *sbuf,
+ unsigned short *dmask,
+ unsigned short *curvemask,
+ unsigned short *texmask,
+ float mask_max,
+ int destx,
+ int desty,
+ int origx,
+ int origy,
+ int srcx,
+ int srcy,
+ int width,
+ int height,
+ IMB_BlendMode mode,
+ bool accumulate)
{
- unsigned int *drect = NULL, *orect = NULL, *srect = NULL, *dr, *or, *sr;
- float *drectf = NULL, *orectf = NULL, *srectf = NULL, *drf, *orf, *srf;
- unsigned short *cmaskrect = curvemask, *cmr;
- unsigned short *dmaskrect = dmask, *dmr;
- unsigned short *texmaskrect = texmask, *tmr;
- int do_float, do_char, srcskip, destskip, origskip, x;
- IMB_blend_func func = NULL;
- IMB_blend_func_float func_float = NULL;
-
- if (dbuf == NULL || obuf == NULL) return;
-
- imb_rectclip3(dbuf, obuf, sbuf, &destx, &desty, &origx, &origy, &srcx, &srcy, &width, &height);
-
- if (width == 0 || height == 0) return;
- if (sbuf && sbuf->channels != 4) return;
- if (dbuf->channels != 4) return;
-
- do_char = (sbuf && sbuf->rect && dbuf->rect && obuf->rect);
- do_float = (sbuf && sbuf->rect_float && dbuf->rect_float && obuf->rect_float);
-
- if (do_char) {
- drect = dbuf->rect + ((size_t)desty) * dbuf->x + destx;
- orect = obuf->rect + ((size_t)origy) * obuf->x + origx;
- }
- if (do_float) {
- drectf = dbuf->rect_float + (((size_t)desty) * dbuf->x + destx) * 4;
- orectf = obuf->rect_float + (((size_t)origy) * obuf->x + origx) * 4;
- }
-
- if (dmaskrect)
- dmaskrect += ((size_t)origy) * obuf->x + origx;
-
- destskip = dbuf->x;
- origskip = obuf->x;
-
- if (sbuf) {
- if (do_char) srect = sbuf->rect + ((size_t)srcy) * sbuf->x + srcx;
- if (do_float) srectf = sbuf->rect_float + (((size_t)srcy) * sbuf->x + srcx) * 4;
- srcskip = sbuf->x;
-
- if (cmaskrect)
- cmaskrect += ((size_t)srcy) * sbuf->x + srcx;
-
- if (texmaskrect)
- texmaskrect += ((size_t)srcy) * sbuf->x + srcx;
- }
- else {
- srect = drect;
- srectf = drectf;
- srcskip = destskip;
- }
-
- if (mode == IMB_BLEND_COPY) {
- /* copy */
- for (; height > 0; height--) {
- if (do_char) {
- memcpy(drect, srect, width * sizeof(int));
- drect += destskip;
- srect += srcskip;
- }
-
- if (do_float) {
- memcpy(drectf, srectf, width * sizeof(float) * 4);
- drectf += destskip * 4;
- srectf += srcskip * 4;
- }
- }
- }
- else if (mode == IMB_BLEND_COPY_RGB) {
- /* copy rgb only */
- for (; height > 0; height--) {
- if (do_char) {
- dr = drect;
- sr = srect;
- for (x = width; x > 0; x--, dr++, sr++) {
- ((char *)dr)[0] = ((char *)sr)[0];
- ((char *)dr)[1] = ((char *)sr)[1];
- ((char *)dr)[2] = ((char *)sr)[2];
- }
- drect += destskip;
- srect += srcskip;
- }
-
- if (do_float) {
- drf = drectf;
- srf = srectf;
- for (x = width; x > 0; x--, drf += 4, srf += 4) {
- float map_alpha = (srf[3] == 0.0f) ? drf[3] : drf[3] / srf[3];
-
- drf[0] = srf[0] * map_alpha;
- drf[1] = srf[1] * map_alpha;
- drf[2] = srf[2] * map_alpha;
- }
- drectf += destskip * 4;
- srectf += srcskip * 4;
- }
- }
- }
- else if (mode == IMB_BLEND_COPY_ALPHA) {
- /* copy alpha only */
- for (; height > 0; height--) {
- if (do_char) {
- dr = drect;
- sr = srect;
- for (x = width; x > 0; x--, dr++, sr++)
- ((char *)dr)[3] = ((char *)sr)[3];
- drect += destskip;
- srect += srcskip;
- }
-
- if (do_float) {
- drf = drectf;
- srf = srectf;
- for (x = width; x > 0; x--, drf += 4, srf += 4)
- drf[3] = srf[3];
- drectf += destskip * 4;
- srectf += srcskip * 4;
- }
- }
- }
- else {
- switch (mode) {
- case IMB_BLEND_MIX:
- case IMB_BLEND_INTERPOLATE:
- func = blend_color_mix_byte;
- func_float = blend_color_mix_float;
- break;
- case IMB_BLEND_ADD:
- func = blend_color_add_byte;
- func_float = blend_color_add_float;
- break;
- case IMB_BLEND_SUB:
- func = blend_color_sub_byte;
- func_float = blend_color_sub_float;
- break;
- case IMB_BLEND_MUL:
- func = blend_color_mul_byte;
- func_float = blend_color_mul_float;
- break;
- case IMB_BLEND_LIGHTEN:
- func = blend_color_lighten_byte;
- func_float = blend_color_lighten_float;
- break;
- case IMB_BLEND_DARKEN:
- func = blend_color_darken_byte;
- func_float = blend_color_darken_float;
- break;
- case IMB_BLEND_ERASE_ALPHA:
- func = blend_color_erase_alpha_byte;
- func_float = blend_color_erase_alpha_float;
- break;
- case IMB_BLEND_ADD_ALPHA:
- func = blend_color_add_alpha_byte;
- func_float = blend_color_add_alpha_float;
- break;
- case IMB_BLEND_OVERLAY:
- func = blend_color_overlay_byte;
- func_float = blend_color_overlay_float;
- break;
- case IMB_BLEND_HARDLIGHT:
- func = blend_color_hardlight_byte;
- func_float = blend_color_hardlight_float;
- break;
- case IMB_BLEND_COLORBURN:
- func = blend_color_burn_byte;
- func_float = blend_color_burn_float;
- break;
- case IMB_BLEND_LINEARBURN:
- func = blend_color_linearburn_byte;
- func_float = blend_color_linearburn_float;
- break;
- case IMB_BLEND_COLORDODGE:
- func = blend_color_dodge_byte;
- func_float = blend_color_dodge_float;
- break;
- case IMB_BLEND_SCREEN:
- func = blend_color_screen_byte;
- func_float = blend_color_screen_float;
- break;
- case IMB_BLEND_SOFTLIGHT:
- func = blend_color_softlight_byte;
- func_float = blend_color_softlight_float;
- break;
- case IMB_BLEND_PINLIGHT:
- func = blend_color_pinlight_byte;
- func_float = blend_color_pinlight_float;
- break;
- case IMB_BLEND_LINEARLIGHT:
- func = blend_color_linearlight_byte;
- func_float = blend_color_linearlight_float;
- break;
- case IMB_BLEND_VIVIDLIGHT:
- func = blend_color_vividlight_byte;
- func_float = blend_color_vividlight_float;
- break;
- case IMB_BLEND_DIFFERENCE:
- func = blend_color_difference_byte;
- func_float = blend_color_difference_float;
- break;
- case IMB_BLEND_EXCLUSION:
- func = blend_color_exclusion_byte;
- func_float = blend_color_exclusion_float;
- break;
- case IMB_BLEND_COLOR:
- func = blend_color_color_byte;
- func_float = blend_color_color_float;
- break;
- case IMB_BLEND_HUE:
- func = blend_color_hue_byte;
- func_float = blend_color_hue_float;
- break;
- case IMB_BLEND_SATURATION:
- func = blend_color_saturation_byte;
- func_float = blend_color_saturation_float;
- break;
- case IMB_BLEND_LUMINOSITY:
- func = blend_color_luminosity_byte;
- func_float = blend_color_luminosity_float;
- break;
- default:
- break;
- }
-
- /* blend */
- for (; height > 0; height--) {
- if (do_char) {
- dr = drect;
- or = orect;
- sr = srect;
-
- if (cmaskrect) {
- /* mask accumulation for painting */
- cmr = cmaskrect;
- tmr = texmaskrect;
-
- /* destination mask present, do max alpha masking */
- if (dmaskrect) {
- dmr = dmaskrect;
- for (x = width; x > 0; x--, dr++, or++, sr++, dmr++, cmr++) {
- unsigned char *src = (unsigned char *)sr;
- float mask_lim = mask_max * (*cmr);
-
- if (texmaskrect)
- mask_lim *= ((*tmr++) / 65535.0f);
-
- if (src[3] && mask_lim) {
- float mask;
-
- if (accumulate)
- mask = *dmr + mask_lim;
- else
- mask = *dmr + mask_lim - (*dmr * (*cmr / 65535.0f));
-
- mask = min_ff(mask, 65535.0);
-
- if (mask > *dmr) {
- unsigned char mask_src[4];
-
- *dmr = mask;
-
- mask_src[0] = src[0];
- mask_src[1] = src[1];
- mask_src[2] = src[2];
-
- if (mode == IMB_BLEND_INTERPOLATE) {
- mask_src[3] = src[3];
- blend_color_interpolate_byte((unsigned char *)dr, (unsigned char *)or, mask_src, mask / 65535.0f);
- }
- else {
- mask_src[3] = divide_round_i(src[3] * mask, 65535);
- func((unsigned char *)dr, (unsigned char *)or, mask_src);
- }
- }
- }
- }
- dmaskrect += origskip;
- }
- /* no destination mask buffer, do regular blend with masktexture if present */
- else {
- for (x = width; x > 0; x--, dr++, or++, sr++, cmr++) {
- unsigned char *src = (unsigned char *)sr;
- float mask = (float)mask_max * ((float)(*cmr));
-
- if (texmaskrect)
- mask *= ((float)(*tmr++) / 65535.0f);
-
- mask = min_ff(mask, 65535.0);
-
- if (src[3] && (mask > 0.0f)) {
- unsigned char mask_src[4];
-
- mask_src[0] = src[0];
- mask_src[1] = src[1];
- mask_src[2] = src[2];
-
- if (mode == IMB_BLEND_INTERPOLATE) {
- mask_src[3] = src[3];
- blend_color_interpolate_byte((unsigned char *)dr, (unsigned char *)or, mask_src, mask / 65535.0f);
- }
- else {
- mask_src[3] = divide_round_i(src[3] * mask, 65535);
- func((unsigned char *)dr, (unsigned char *)or, mask_src);
- }
- }
- }
- }
-
- cmaskrect += srcskip;
- if (texmaskrect)
- texmaskrect += srcskip;
- }
- else {
- /* regular blending */
- for (x = width; x > 0; x--, dr++, or++, sr++) {
- if (((unsigned char *)sr)[3])
- func((unsigned char *)dr, (unsigned char *)or, (unsigned char *)sr);
- }
- }
-
- drect += destskip;
- orect += origskip;
- srect += srcskip;
- }
-
- if (do_float) {
- drf = drectf;
- orf = orectf;
- srf = srectf;
-
- if (cmaskrect) {
- /* mask accumulation for painting */
- cmr = cmaskrect;
- tmr = texmaskrect;
-
- /* destination mask present, do max alpha masking */
- if (dmaskrect) {
- dmr = dmaskrect;
- for (x = width; x > 0; x--, drf += 4, orf += 4, srf += 4, dmr++, cmr++) {
- float mask_lim = mask_max * (*cmr);
-
- if (texmaskrect)
- mask_lim *= ((*tmr++) / 65535.0f);
-
- if (srf[3] && mask_lim) {
- float mask;
-
- if (accumulate)
- mask = min_ff(*dmr + mask_lim, 65535.0);
- else
- mask = *dmr + mask_lim - (*dmr * (*cmr / 65535.0f));
-
- mask = min_ff(mask, 65535.0);
-
- if (mask > *dmr) {
- *dmr = mask;
-
- if (mode == IMB_BLEND_INTERPOLATE) {
- blend_color_interpolate_float(drf, orf, srf, mask / 65535.0f);
- }
- else {
- float mask_srf[4];
- mul_v4_v4fl(mask_srf, srf, mask / 65535.0f);
- func_float(drf, orf, mask_srf);
- }
- }
- }
- }
- dmaskrect += origskip;
- }
- /* no destination mask buffer, do regular blend with masktexture if present */
- else {
- for (x = width; x > 0; x--, drf += 4, orf += 4, srf += 4, cmr++) {
- float mask = (float)mask_max * ((float)(*cmr));
-
- if (texmaskrect)
- mask *= ((float)(*tmr++) / 65535.0f);
-
- mask = min_ff(mask, 65535.0);
-
- if (srf[3] && (mask > 0.0f)) {
- if (mode == IMB_BLEND_INTERPOLATE) {
- blend_color_interpolate_float(drf, orf, srf, mask / 65535.0f);
- }
- else {
- float mask_srf[4];
- mul_v4_v4fl(mask_srf, srf, mask / 65535.0f);
- func_float(drf, orf, mask_srf);
- }
-
- }
- }
- }
-
- cmaskrect += srcskip;
- if (texmaskrect)
- texmaskrect += srcskip;
- }
- else {
- /* regular blending */
- for (x = width; x > 0; x--, drf += 4, orf += 4, srf += 4) {
- if (srf[3] != 0)
- func_float(drf, orf, srf);
- }
- }
-
- drectf += destskip * 4;
- orectf += origskip * 4;
- srectf += srcskip * 4;
- }
- }
- }
+ unsigned int *drect = NULL, *orect = NULL, *srect = NULL, *dr, * or, *sr;
+ float *drectf = NULL, *orectf = NULL, *srectf = NULL, *drf, *orf, *srf;
+ unsigned short *cmaskrect = curvemask, *cmr;
+ unsigned short *dmaskrect = dmask, *dmr;
+ unsigned short *texmaskrect = texmask, *tmr;
+ int do_float, do_char, srcskip, destskip, origskip, x;
+ IMB_blend_func func = NULL;
+ IMB_blend_func_float func_float = NULL;
+
+ if (dbuf == NULL || obuf == NULL)
+ return;
+
+ imb_rectclip3(dbuf, obuf, sbuf, &destx, &desty, &origx, &origy, &srcx, &srcy, &width, &height);
+
+ if (width == 0 || height == 0)
+ return;
+ if (sbuf && sbuf->channels != 4)
+ return;
+ if (dbuf->channels != 4)
+ return;
+
+ do_char = (sbuf && sbuf->rect && dbuf->rect && obuf->rect);
+ do_float = (sbuf && sbuf->rect_float && dbuf->rect_float && obuf->rect_float);
+
+ if (do_char) {
+ drect = dbuf->rect + ((size_t)desty) * dbuf->x + destx;
+ orect = obuf->rect + ((size_t)origy) * obuf->x + origx;
+ }
+ if (do_float) {
+ drectf = dbuf->rect_float + (((size_t)desty) * dbuf->x + destx) * 4;
+ orectf = obuf->rect_float + (((size_t)origy) * obuf->x + origx) * 4;
+ }
+
+ if (dmaskrect)
+ dmaskrect += ((size_t)origy) * obuf->x + origx;
+
+ destskip = dbuf->x;
+ origskip = obuf->x;
+
+ if (sbuf) {
+ if (do_char)
+ srect = sbuf->rect + ((size_t)srcy) * sbuf->x + srcx;
+ if (do_float)
+ srectf = sbuf->rect_float + (((size_t)srcy) * sbuf->x + srcx) * 4;
+ srcskip = sbuf->x;
+
+ if (cmaskrect)
+ cmaskrect += ((size_t)srcy) * sbuf->x + srcx;
+
+ if (texmaskrect)
+ texmaskrect += ((size_t)srcy) * sbuf->x + srcx;
+ }
+ else {
+ srect = drect;
+ srectf = drectf;
+ srcskip = destskip;
+ }
+
+ if (mode == IMB_BLEND_COPY) {
+ /* copy */
+ for (; height > 0; height--) {
+ if (do_char) {
+ memcpy(drect, srect, width * sizeof(int));
+ drect += destskip;
+ srect += srcskip;
+ }
+
+ if (do_float) {
+ memcpy(drectf, srectf, width * sizeof(float) * 4);
+ drectf += destskip * 4;
+ srectf += srcskip * 4;
+ }
+ }
+ }
+ else if (mode == IMB_BLEND_COPY_RGB) {
+ /* copy rgb only */
+ for (; height > 0; height--) {
+ if (do_char) {
+ dr = drect;
+ sr = srect;
+ for (x = width; x > 0; x--, dr++, sr++) {
+ ((char *)dr)[0] = ((char *)sr)[0];
+ ((char *)dr)[1] = ((char *)sr)[1];
+ ((char *)dr)[2] = ((char *)sr)[2];
+ }
+ drect += destskip;
+ srect += srcskip;
+ }
+
+ if (do_float) {
+ drf = drectf;
+ srf = srectf;
+ for (x = width; x > 0; x--, drf += 4, srf += 4) {
+ float map_alpha = (srf[3] == 0.0f) ? drf[3] : drf[3] / srf[3];
+
+ drf[0] = srf[0] * map_alpha;
+ drf[1] = srf[1] * map_alpha;
+ drf[2] = srf[2] * map_alpha;
+ }
+ drectf += destskip * 4;
+ srectf += srcskip * 4;
+ }
+ }
+ }
+ else if (mode == IMB_BLEND_COPY_ALPHA) {
+ /* copy alpha only */
+ for (; height > 0; height--) {
+ if (do_char) {
+ dr = drect;
+ sr = srect;
+ for (x = width; x > 0; x--, dr++, sr++)
+ ((char *)dr)[3] = ((char *)sr)[3];
+ drect += destskip;
+ srect += srcskip;
+ }
+
+ if (do_float) {
+ drf = drectf;
+ srf = srectf;
+ for (x = width; x > 0; x--, drf += 4, srf += 4)
+ drf[3] = srf[3];
+ drectf += destskip * 4;
+ srectf += srcskip * 4;
+ }
+ }
+ }
+ else {
+ switch (mode) {
+ case IMB_BLEND_MIX:
+ case IMB_BLEND_INTERPOLATE:
+ func = blend_color_mix_byte;
+ func_float = blend_color_mix_float;
+ break;
+ case IMB_BLEND_ADD:
+ func = blend_color_add_byte;
+ func_float = blend_color_add_float;
+ break;
+ case IMB_BLEND_SUB:
+ func = blend_color_sub_byte;
+ func_float = blend_color_sub_float;
+ break;
+ case IMB_BLEND_MUL:
+ func = blend_color_mul_byte;
+ func_float = blend_color_mul_float;
+ break;
+ case IMB_BLEND_LIGHTEN:
+ func = blend_color_lighten_byte;
+ func_float = blend_color_lighten_float;
+ break;
+ case IMB_BLEND_DARKEN:
+ func = blend_color_darken_byte;
+ func_float = blend_color_darken_float;
+ break;
+ case IMB_BLEND_ERASE_ALPHA:
+ func = blend_color_erase_alpha_byte;
+ func_float = blend_color_erase_alpha_float;
+ break;
+ case IMB_BLEND_ADD_ALPHA:
+ func = blend_color_add_alpha_byte;
+ func_float = blend_color_add_alpha_float;
+ break;
+ case IMB_BLEND_OVERLAY:
+ func = blend_color_overlay_byte;
+ func_float = blend_color_overlay_float;
+ break;
+ case IMB_BLEND_HARDLIGHT:
+ func = blend_color_hardlight_byte;
+ func_float = blend_color_hardlight_float;
+ break;
+ case IMB_BLEND_COLORBURN:
+ func = blend_color_burn_byte;
+ func_float = blend_color_burn_float;
+ break;
+ case IMB_BLEND_LINEARBURN:
+ func = blend_color_linearburn_byte;
+ func_float = blend_color_linearburn_float;
+ break;
+ case IMB_BLEND_COLORDODGE:
+ func = blend_color_dodge_byte;
+ func_float = blend_color_dodge_float;
+ break;
+ case IMB_BLEND_SCREEN:
+ func = blend_color_screen_byte;
+ func_float = blend_color_screen_float;
+ break;
+ case IMB_BLEND_SOFTLIGHT:
+ func = blend_color_softlight_byte;
+ func_float = blend_color_softlight_float;
+ break;
+ case IMB_BLEND_PINLIGHT:
+ func = blend_color_pinlight_byte;
+ func_float = blend_color_pinlight_float;
+ break;
+ case IMB_BLEND_LINEARLIGHT:
+ func = blend_color_linearlight_byte;
+ func_float = blend_color_linearlight_float;
+ break;
+ case IMB_BLEND_VIVIDLIGHT:
+ func = blend_color_vividlight_byte;
+ func_float = blend_color_vividlight_float;
+ break;
+ case IMB_BLEND_DIFFERENCE:
+ func = blend_color_difference_byte;
+ func_float = blend_color_difference_float;
+ break;
+ case IMB_BLEND_EXCLUSION:
+ func = blend_color_exclusion_byte;
+ func_float = blend_color_exclusion_float;
+ break;
+ case IMB_BLEND_COLOR:
+ func = blend_color_color_byte;
+ func_float = blend_color_color_float;
+ break;
+ case IMB_BLEND_HUE:
+ func = blend_color_hue_byte;
+ func_float = blend_color_hue_float;
+ break;
+ case IMB_BLEND_SATURATION:
+ func = blend_color_saturation_byte;
+ func_float = blend_color_saturation_float;
+ break;
+ case IMB_BLEND_LUMINOSITY:
+ func = blend_color_luminosity_byte;
+ func_float = blend_color_luminosity_float;
+ break;
+ default:
+ break;
+ }
+
+ /* blend */
+ for (; height > 0; height--) {
+ if (do_char) {
+ dr = drect;
+ or = orect;
+ sr = srect;
+
+ if (cmaskrect) {
+ /* mask accumulation for painting */
+ cmr = cmaskrect;
+ tmr = texmaskrect;
+
+ /* destination mask present, do max alpha masking */
+ if (dmaskrect) {
+ dmr = dmaskrect;
+ for (x = width; x > 0; x--, dr++, or ++, sr++, dmr++, cmr++) {
+ unsigned char *src = (unsigned char *)sr;
+ float mask_lim = mask_max * (*cmr);
+
+ if (texmaskrect)
+ mask_lim *= ((*tmr++) / 65535.0f);
+
+ if (src[3] && mask_lim) {
+ float mask;
+
+ if (accumulate)
+ mask = *dmr + mask_lim;
+ else
+ mask = *dmr + mask_lim - (*dmr * (*cmr / 65535.0f));
+
+ mask = min_ff(mask, 65535.0);
+
+ if (mask > *dmr) {
+ unsigned char mask_src[4];
+
+ *dmr = mask;
+
+ mask_src[0] = src[0];
+ mask_src[1] = src[1];
+ mask_src[2] = src[2];
+
+ if (mode == IMB_BLEND_INTERPOLATE) {
+ mask_src[3] = src[3];
+ blend_color_interpolate_byte(
+ (unsigned char *)dr, (unsigned char *) or, mask_src, mask / 65535.0f);
+ }
+ else {
+ mask_src[3] = divide_round_i(src[3] * mask, 65535);
+ func((unsigned char *)dr, (unsigned char *) or, mask_src);
+ }
+ }
+ }
+ }
+ dmaskrect += origskip;
+ }
+ /* no destination mask buffer, do regular blend with masktexture if present */
+ else {
+ for (x = width; x > 0; x--, dr++, or ++, sr++, cmr++) {
+ unsigned char *src = (unsigned char *)sr;
+ float mask = (float)mask_max * ((float)(*cmr));
+
+ if (texmaskrect)
+ mask *= ((float)(*tmr++) / 65535.0f);
+
+ mask = min_ff(mask, 65535.0);
+
+ if (src[3] && (mask > 0.0f)) {
+ unsigned char mask_src[4];
+
+ mask_src[0] = src[0];
+ mask_src[1] = src[1];
+ mask_src[2] = src[2];
+
+ if (mode == IMB_BLEND_INTERPOLATE) {
+ mask_src[3] = src[3];
+ blend_color_interpolate_byte(
+ (unsigned char *)dr, (unsigned char *) or, mask_src, mask / 65535.0f);
+ }
+ else {
+ mask_src[3] = divide_round_i(src[3] * mask, 65535);
+ func((unsigned char *)dr, (unsigned char *) or, mask_src);
+ }
+ }
+ }
+ }
+
+ cmaskrect += srcskip;
+ if (texmaskrect)
+ texmaskrect += srcskip;
+ }
+ else {
+ /* regular blending */
+ for (x = width; x > 0; x--, dr++, or ++, sr++) {
+ if (((unsigned char *)sr)[3])
+ func((unsigned char *)dr, (unsigned char *) or, (unsigned char *)sr);
+ }
+ }
+
+ drect += destskip;
+ orect += origskip;
+ srect += srcskip;
+ }
+
+ if (do_float) {
+ drf = drectf;
+ orf = orectf;
+ srf = srectf;
+
+ if (cmaskrect) {
+ /* mask accumulation for painting */
+ cmr = cmaskrect;
+ tmr = texmaskrect;
+
+ /* destination mask present, do max alpha masking */
+ if (dmaskrect) {
+ dmr = dmaskrect;
+ for (x = width; x > 0; x--, drf += 4, orf += 4, srf += 4, dmr++, cmr++) {
+ float mask_lim = mask_max * (*cmr);
+
+ if (texmaskrect)
+ mask_lim *= ((*tmr++) / 65535.0f);
+
+ if (srf[3] && mask_lim) {
+ float mask;
+
+ if (accumulate)
+ mask = min_ff(*dmr + mask_lim, 65535.0);
+ else
+ mask = *dmr + mask_lim - (*dmr * (*cmr / 65535.0f));
+
+ mask = min_ff(mask, 65535.0);
+
+ if (mask > *dmr) {
+ *dmr = mask;
+
+ if (mode == IMB_BLEND_INTERPOLATE) {
+ blend_color_interpolate_float(drf, orf, srf, mask / 65535.0f);
+ }
+ else {
+ float mask_srf[4];
+ mul_v4_v4fl(mask_srf, srf, mask / 65535.0f);
+ func_float(drf, orf, mask_srf);
+ }
+ }
+ }
+ }
+ dmaskrect += origskip;
+ }
+ /* no destination mask buffer, do regular blend with masktexture if present */
+ else {
+ for (x = width; x > 0; x--, drf += 4, orf += 4, srf += 4, cmr++) {
+ float mask = (float)mask_max * ((float)(*cmr));
+
+ if (texmaskrect)
+ mask *= ((float)(*tmr++) / 65535.0f);
+
+ mask = min_ff(mask, 65535.0);
+
+ if (srf[3] && (mask > 0.0f)) {
+ if (mode == IMB_BLEND_INTERPOLATE) {
+ blend_color_interpolate_float(drf, orf, srf, mask / 65535.0f);
+ }
+ else {
+ float mask_srf[4];
+ mul_v4_v4fl(mask_srf, srf, mask / 65535.0f);
+ func_float(drf, orf, mask_srf);
+ }
+ }
+ }
+ }
+
+ cmaskrect += srcskip;
+ if (texmaskrect)
+ texmaskrect += srcskip;
+ }
+ else {
+ /* regular blending */
+ for (x = width; x > 0; x--, drf += 4, orf += 4, srf += 4) {
+ if (srf[3] != 0)
+ func_float(drf, orf, srf);
+ }
+ }
+
+ drectf += destskip * 4;
+ orectf += origskip * 4;
+ srectf += srcskip * 4;
+ }
+ }
+ }
}
typedef struct RectBlendThreadData {
- ImBuf *dbuf, *obuf, *sbuf;
- unsigned short *dmask, *curvemask, *texmask;
- float mask_max;
- int destx, desty, origx, origy;
- int srcx, srcy, width;
- IMB_BlendMode mode;
- bool accumulate;
+ ImBuf *dbuf, *obuf, *sbuf;
+ unsigned short *dmask, *curvemask, *texmask;
+ float mask_max;
+ int destx, desty, origx, origy;
+ int srcx, srcy, width;
+ IMB_BlendMode mode;
+ bool accumulate;
} RectBlendThreadData;
-static void rectblend_thread_do(void *data_v,
- int start_scanline,
- int num_scanlines)
+static void rectblend_thread_do(void *data_v, int start_scanline, int num_scanlines)
{
- RectBlendThreadData *data = (RectBlendThreadData *)data_v;
- IMB_rectblend(data->dbuf, data->obuf, data->sbuf,
- data->dmask, data->curvemask, data->texmask,
- data->mask_max,
- data->destx,
- data->desty + start_scanline,
- data->origx,
- data->origy + start_scanline,
- data->srcx,
- data->srcy + start_scanline,
- data->width, num_scanlines,
- data->mode, data->accumulate);
+ RectBlendThreadData *data = (RectBlendThreadData *)data_v;
+ IMB_rectblend(data->dbuf,
+ data->obuf,
+ data->sbuf,
+ data->dmask,
+ data->curvemask,
+ data->texmask,
+ data->mask_max,
+ data->destx,
+ data->desty + start_scanline,
+ data->origx,
+ data->origy + start_scanline,
+ data->srcx,
+ data->srcy + start_scanline,
+ data->width,
+ num_scanlines,
+ data->mode,
+ data->accumulate);
}
-void IMB_rectblend_threaded(ImBuf *dbuf, ImBuf *obuf, ImBuf *sbuf,
- unsigned short *dmask, unsigned short *curvemask,
- unsigned short *texmask, float mask_max,
- int destx, int desty, int origx, int origy,
- int srcx, int srcy, int width, int height,
- IMB_BlendMode mode, bool accumulate)
+void IMB_rectblend_threaded(ImBuf *dbuf,
+ ImBuf *obuf,
+ ImBuf *sbuf,
+ unsigned short *dmask,
+ unsigned short *curvemask,
+ unsigned short *texmask,
+ float mask_max,
+ int destx,
+ int desty,
+ int origx,
+ int origy,
+ int srcx,
+ int srcy,
+ int width,
+ int height,
+ IMB_BlendMode mode,
+ bool accumulate)
{
- if (((size_t)width) * height < 64 * 64) {
- IMB_rectblend(dbuf, obuf, sbuf, dmask, curvemask, texmask,
- mask_max, destx, desty, origx, origy,
- srcx, srcy, width, height, mode, accumulate);
- }
- else {
- RectBlendThreadData data;
- data.dbuf = dbuf;
- data.obuf = obuf;
- data.sbuf = sbuf;
- data.dmask = dmask;
- data.curvemask = curvemask;
- data.texmask = texmask;
- data.mask_max = mask_max;
- data.destx = destx;
- data.desty = desty;
- data.origx = origx;
- data.origy = origy;
- data.srcx = srcx;
- data.srcy = srcy;
- data.width = width;
- data.mode = mode;
- data.accumulate = accumulate;
- IMB_processor_apply_threaded_scanlines(
- height, rectblend_thread_do, &data);
- }
+ if (((size_t)width) * height < 64 * 64) {
+ IMB_rectblend(dbuf,
+ obuf,
+ sbuf,
+ dmask,
+ curvemask,
+ texmask,
+ mask_max,
+ destx,
+ desty,
+ origx,
+ origy,
+ srcx,
+ srcy,
+ width,
+ height,
+ mode,
+ accumulate);
+ }
+ else {
+ RectBlendThreadData data;
+ data.dbuf = dbuf;
+ data.obuf = obuf;
+ data.sbuf = sbuf;
+ data.dmask = dmask;
+ data.curvemask = curvemask;
+ data.texmask = texmask;
+ data.mask_max = mask_max;
+ data.destx = destx;
+ data.desty = desty;
+ data.origx = origx;
+ data.origy = origy;
+ data.srcx = srcx;
+ data.srcy = srcy;
+ data.width = width;
+ data.mode = mode;
+ data.accumulate = accumulate;
+ IMB_processor_apply_threaded_scanlines(height, rectblend_thread_do, &data);
+ }
}
/* fill */
void IMB_rectfill(ImBuf *drect, const float col[4])
{
- int num;
-
- if (drect->rect) {
- unsigned int *rrect = drect->rect;
- char ccol[4];
-
- ccol[0] = (int)(col[0] * 255);
- ccol[1] = (int)(col[1] * 255);
- ccol[2] = (int)(col[2] * 255);
- ccol[3] = (int)(col[3] * 255);
-
- num = drect->x * drect->y;
- for (; num > 0; num--)
- *rrect++ = *((unsigned int *)ccol);
- }
-
- if (drect->rect_float) {
- float *rrectf = drect->rect_float;
-
- num = drect->x * drect->y;
- for (; num > 0; num--) {
- *rrectf++ = col[0];
- *rrectf++ = col[1];
- *rrectf++ = col[2];
- *rrectf++ = col[3];
- }
- }
+ int num;
+
+ if (drect->rect) {
+ unsigned int *rrect = drect->rect;
+ char ccol[4];
+
+ ccol[0] = (int)(col[0] * 255);
+ ccol[1] = (int)(col[1] * 255);
+ ccol[2] = (int)(col[2] * 255);
+ ccol[3] = (int)(col[3] * 255);
+
+ num = drect->x * drect->y;
+ for (; num > 0; num--)
+ *rrect++ = *((unsigned int *)ccol);
+ }
+
+ if (drect->rect_float) {
+ float *rrectf = drect->rect_float;
+
+ num = drect->x * drect->y;
+ for (; num > 0; num--) {
+ *rrectf++ = col[0];
+ *rrectf++ = col[1];
+ *rrectf++ = col[2];
+ *rrectf++ = col[3];
+ }
+ }
}
-
-void buf_rectfill_area(unsigned char *rect, float *rectf, int width, int height,
- const float col[4], struct ColorManagedDisplay *display,
- int x1, int y1, int x2, int y2)
+void buf_rectfill_area(unsigned char *rect,
+ float *rectf,
+ int width,
+ int height,
+ const float col[4],
+ struct ColorManagedDisplay *display,
+ int x1,
+ int y1,
+ int x2,
+ int y2)
{
- int i, j;
- float a; /* alpha */
- float ai; /* alpha inverted */
- float aich; /* alpha, inverted, ai/255.0 - Convert char to float at the same time */
- if ((!rect && !rectf) || (!col) || col[3] == 0.0f)
- return;
-
- /* sanity checks for coords */
- CLAMP(x1, 0, width);
- CLAMP(x2, 0, width);
- CLAMP(y1, 0, height);
- CLAMP(y2, 0, height);
-
- if (x1 > x2) SWAP(int, x1, x2);
- if (y1 > y2) SWAP(int, y1, y2);
- if (x1 == x2 || y1 == y2) return;
-
- a = col[3];
- ai = 1 - a;
- aich = ai / 255.0f;
-
- if (rect) {
- unsigned char *pixel;
- unsigned char chr = 0, chg = 0, chb = 0;
- float fr = 0, fg = 0, fb = 0;
-
- const int alphaint = unit_float_to_uchar_clamp(a);
-
- if (a == 1.0f) {
- chr = unit_float_to_uchar_clamp(col[0]);
- chg = unit_float_to_uchar_clamp(col[1]);
- chb = unit_float_to_uchar_clamp(col[2]);
- }
- else {
- fr = col[0] * a;
- fg = col[1] * a;
- fb = col[2] * a;
- }
- for (j = 0; j < y2 - y1; j++) {
- for (i = 0; i < x2 - x1; i++) {
- pixel = rect + 4 * (((y1 + j) * width) + (x1 + i));
- if (pixel >= rect && pixel < rect + (4 * (width * height))) {
- if (a == 1.0f) {
- pixel[0] = chr;
- pixel[1] = chg;
- pixel[2] = chb;
- pixel[3] = 255;
- }
- else {
- int alphatest;
- pixel[0] = (char)((fr + ((float)pixel[0] * aich)) * 255.0f);
- pixel[1] = (char)((fg + ((float)pixel[1] * aich)) * 255.0f);
- pixel[2] = (char)((fb + ((float)pixel[2] * aich)) * 255.0f);
- pixel[3] = (char)((alphatest = ((int)pixel[3] + alphaint)) < 255 ? alphatest : 255);
- }
- }
- }
- }
- }
-
- if (rectf) {
- float col_conv[4];
- float *pixel;
-
- if (display) {
- copy_v4_v4(col_conv, col);
- IMB_colormanagement_display_to_scene_linear_v3(col_conv, display);
- }
- else {
- srgb_to_linearrgb_v4(col_conv, col);
- }
-
- for (j = 0; j < y2 - y1; j++) {
- for (i = 0; i < x2 - x1; i++) {
- pixel = rectf + 4 * (((y1 + j) * width) + (x1 + i));
- if (a == 1.0f) {
- pixel[0] = col_conv[0];
- pixel[1] = col_conv[1];
- pixel[2] = col_conv[2];
- pixel[3] = 1.0f;
- }
- else {
- float alphatest;
- pixel[0] = (col_conv[0] * a) + (pixel[0] * ai);
- pixel[1] = (col_conv[1] * a) + (pixel[1] * ai);
- pixel[2] = (col_conv[2] * a) + (pixel[2] * ai);
- pixel[3] = (alphatest = (pixel[3] + a)) < 1.0f ? alphatest : 1.0f;
- }
- }
- }
- }
+ int i, j;
+ float a; /* alpha */
+ float ai; /* alpha inverted */
+ float aich; /* alpha, inverted, ai/255.0 - Convert char to float at the same time */
+ if ((!rect && !rectf) || (!col) || col[3] == 0.0f)
+ return;
+
+ /* sanity checks for coords */
+ CLAMP(x1, 0, width);
+ CLAMP(x2, 0, width);
+ CLAMP(y1, 0, height);
+ CLAMP(y2, 0, height);
+
+ if (x1 > x2)
+ SWAP(int, x1, x2);
+ if (y1 > y2)
+ SWAP(int, y1, y2);
+ if (x1 == x2 || y1 == y2)
+ return;
+
+ a = col[3];
+ ai = 1 - a;
+ aich = ai / 255.0f;
+
+ if (rect) {
+ unsigned char *pixel;
+ unsigned char chr = 0, chg = 0, chb = 0;
+ float fr = 0, fg = 0, fb = 0;
+
+ const int alphaint = unit_float_to_uchar_clamp(a);
+
+ if (a == 1.0f) {
+ chr = unit_float_to_uchar_clamp(col[0]);
+ chg = unit_float_to_uchar_clamp(col[1]);
+ chb = unit_float_to_uchar_clamp(col[2]);
+ }
+ else {
+ fr = col[0] * a;
+ fg = col[1] * a;
+ fb = col[2] * a;
+ }
+ for (j = 0; j < y2 - y1; j++) {
+ for (i = 0; i < x2 - x1; i++) {
+ pixel = rect + 4 * (((y1 + j) * width) + (x1 + i));
+ if (pixel >= rect && pixel < rect + (4 * (width * height))) {
+ if (a == 1.0f) {
+ pixel[0] = chr;
+ pixel[1] = chg;
+ pixel[2] = chb;
+ pixel[3] = 255;
+ }
+ else {
+ int alphatest;
+ pixel[0] = (char)((fr + ((float)pixel[0] * aich)) * 255.0f);
+ pixel[1] = (char)((fg + ((float)pixel[1] * aich)) * 255.0f);
+ pixel[2] = (char)((fb + ((float)pixel[2] * aich)) * 255.0f);
+ pixel[3] = (char)((alphatest = ((int)pixel[3] + alphaint)) < 255 ? alphatest : 255);
+ }
+ }
+ }
+ }
+ }
+
+ if (rectf) {
+ float col_conv[4];
+ float *pixel;
+
+ if (display) {
+ copy_v4_v4(col_conv, col);
+ IMB_colormanagement_display_to_scene_linear_v3(col_conv, display);
+ }
+ else {
+ srgb_to_linearrgb_v4(col_conv, col);
+ }
+
+ for (j = 0; j < y2 - y1; j++) {
+ for (i = 0; i < x2 - x1; i++) {
+ pixel = rectf + 4 * (((y1 + j) * width) + (x1 + i));
+ if (a == 1.0f) {
+ pixel[0] = col_conv[0];
+ pixel[1] = col_conv[1];
+ pixel[2] = col_conv[2];
+ pixel[3] = 1.0f;
+ }
+ else {
+ float alphatest;
+ pixel[0] = (col_conv[0] * a) + (pixel[0] * ai);
+ pixel[1] = (col_conv[1] * a) + (pixel[1] * ai);
+ pixel[2] = (col_conv[2] * a) + (pixel[2] * ai);
+ pixel[3] = (alphatest = (pixel[3] + a)) < 1.0f ? alphatest : 1.0f;
+ }
+ }
+ }
+ }
}
-void IMB_rectfill_area(ImBuf *ibuf, const float col[4], int x1, int y1, int x2, int y2, struct ColorManagedDisplay *display)
+void IMB_rectfill_area(ImBuf *ibuf,
+ const float col[4],
+ int x1,
+ int y1,
+ int x2,
+ int y2,
+ struct ColorManagedDisplay *display)
{
- if (!ibuf) return;
- buf_rectfill_area((unsigned char *) ibuf->rect, ibuf->rect_float, ibuf->x, ibuf->y, col, display,
- x1, y1, x2, y2);
+ if (!ibuf)
+ return;
+ buf_rectfill_area((unsigned char *)ibuf->rect,
+ ibuf->rect_float,
+ ibuf->x,
+ ibuf->y,
+ col,
+ display,
+ x1,
+ y1,
+ x2,
+ y2);
}
-
void IMB_rectfill_alpha(ImBuf *ibuf, const float value)
{
- int i;
-
- if (ibuf->rect_float && (ibuf->channels == 4)) {
- float *fbuf = ibuf->rect_float + 3;
- for (i = ibuf->x * ibuf->y; i > 0; i--, fbuf += 4) { *fbuf = value; }
- }
-
- if (ibuf->rect) {
- const unsigned char cvalue = value * 255;
- unsigned char *cbuf = ((unsigned char *)ibuf->rect) + 3;
- for (i = ibuf->x * ibuf->y; i > 0; i--, cbuf += 4) { *cbuf = cvalue; }
- }
+ int i;
+
+ if (ibuf->rect_float && (ibuf->channels == 4)) {
+ float *fbuf = ibuf->rect_float + 3;
+ for (i = ibuf->x * ibuf->y; i > 0; i--, fbuf += 4) {
+ *fbuf = value;
+ }
+ }
+
+ if (ibuf->rect) {
+ const unsigned char cvalue = value * 255;
+ unsigned char *cbuf = ((unsigned char *)ibuf->rect) + 3;
+ for (i = ibuf->x * ibuf->y; i > 0; i--, cbuf += 4) {
+ *cbuf = cvalue;
+ }
+ }
}