File size: 1,301 Bytes
ac7cda5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <blend_impl.h>

void _blend_images_cy_impl(
  const float* mask_warped,
  const float* frame_warped,
  const unsigned char* frame_rgb,
  const int height,
  const int width,
  unsigned char* result) {

    const float* mask_pointer = mask_warped;
    const float* frame_warped_pointer = frame_warped;
    const unsigned char* frame_rgb_pointer = frame_rgb;
    unsigned char* result_pointer = result;

    for(int i = 0; i < height; i++) {
        for(int j = 0; j < width; j++) {
            float mask = *mask_pointer;
            float mask_inv = 1.0f - mask;

            float blended1 = mask * (*frame_warped_pointer) + mask_inv * (*frame_rgb_pointer);
            float blended2 = mask * (*(frame_warped_pointer+1)) + mask_inv * (*(frame_rgb_pointer+1));
            float blended3 = mask * (*(frame_warped_pointer+2)) + mask_inv * (*(frame_rgb_pointer+2));

            *(result_pointer++) = blended1 > 255 ? 255 : (blended1 < 0) ? 0 : (unsigned char)blended1;
            *(result_pointer++) = blended2 > 255 ? 255 : (blended2 < 0) ? 0 : (unsigned char)blended2;
            *(result_pointer++) = blended3 > 255 ? 255 : (blended3 < 0) ? 0 : (unsigned char)blended3;

            frame_warped_pointer+=3;
            frame_rgb_pointer+=3;
            mask_pointer++;
        }
    }
}