forked from bartvdbraak/blender
remove references to raskter from compositor and BKE mask.
This commit is contained in:
parent
2e51811950
commit
4c02549d5d
@ -185,23 +185,8 @@ void BKE_mask_layer_shape_changed_add(struct MaskLayer *masklay, int index,
|
||||
|
||||
void BKE_mask_layer_shape_changed_remove(struct MaskLayer *masklay, int index, int count);
|
||||
|
||||
/* rasterization */
|
||||
int BKE_mask_get_duration(struct Mask *mask);
|
||||
|
||||
void BKE_mask_rasterize_layers(struct ListBase *masklayers, int width, int height, float *buffer,
|
||||
const short do_aspect_correct, const short do_mask_aa,
|
||||
const short do_feather);
|
||||
|
||||
void BKE_mask_rasterize(struct Mask *mask, int width, int height, float *buffer,
|
||||
const short do_aspect_correct, const short do_mask_aa,
|
||||
const short do_feather);
|
||||
|
||||
/* initialization for tiling */
|
||||
#ifdef __PLX_RASKTER_MT__
|
||||
void BKE_mask_init_layers(Mask *mask, struct layer_init_data *mlayer_data, int width, int height,
|
||||
const short do_aspect_correct);
|
||||
#endif
|
||||
|
||||
#define MASKPOINT_ISSEL_ANY(p) ( ((p)->bezt.f1 | (p)->bezt.f2 | (p)->bezt.f2) & SELECT)
|
||||
#define MASKPOINT_ISSEL_KNOT(p) ( (p)->bezt.f2 & SELECT)
|
||||
#define MASKPOINT_ISSEL_HANDLE_ONLY(p) ( (((p)->bezt.f1 | (p)->bezt.f2) & SELECT) && (((p)->bezt.f2 & SELECT) == 0) )
|
||||
@ -216,11 +201,7 @@ void BKE_mask_init_layers(Mask *mask, struct layer_init_data *mlayer_data, int w
|
||||
|
||||
#define MASK_RESOL_MAX 128
|
||||
|
||||
/* disable to test alternate rasterizer */
|
||||
/* #define USE_RASKTER */
|
||||
|
||||
/* mask_rasterize.c */
|
||||
#ifndef USE_RASKTER
|
||||
struct MaskRasterHandle;
|
||||
typedef struct MaskRasterHandle MaskRasterHandle;
|
||||
|
||||
@ -236,6 +217,4 @@ void BKE_maskrasterize_buffer(MaskRasterHandle *mr_handle,
|
||||
const unsigned int width, const unsigned int height,
|
||||
float *buffer);
|
||||
|
||||
#endif /* USE_RASKTER */
|
||||
|
||||
#endif /* __BKE_MASK_H__ */
|
||||
|
@ -56,8 +56,6 @@
|
||||
#include "BKE_movieclip.h"
|
||||
#include "BKE_utildefines.h"
|
||||
|
||||
#include "raskter.h"
|
||||
|
||||
static MaskSplinePoint *mask_spline_point_next(MaskSpline *spline, MaskSplinePoint *points_array, MaskSplinePoint *point)
|
||||
{
|
||||
if (point == &points_array[spline->tot_point - 1]) {
|
||||
@ -2535,256 +2533,7 @@ void BKE_mask_layer_shape_changed_remove(MaskLayer *masklay, int index, int coun
|
||||
}
|
||||
}
|
||||
|
||||
/* local functions */
|
||||
static void invert_vn_vn(float *array, const int size)
|
||||
{
|
||||
float *arr = array + (size - 1);
|
||||
int i = size;
|
||||
while (i--) {
|
||||
*(arr) = 1.0f - *(arr);
|
||||
arr--;
|
||||
}
|
||||
}
|
||||
|
||||
static void m_invert_vn_vn(float *array, const float f, const int size)
|
||||
{
|
||||
float *arr = array + (size - 1);
|
||||
int i = size;
|
||||
while (i--) {
|
||||
*(arr) = 1.0f - (*(arr) * f);
|
||||
arr--;
|
||||
}
|
||||
}
|
||||
|
||||
static void clamp_vn_vn(float *array, const int size)
|
||||
{
|
||||
float *arr = array + (size - 1);
|
||||
|
||||
int i = size;
|
||||
while (i--) {
|
||||
if (*arr < 0.0f) *arr = 0.0f;
|
||||
else if (*arr > 1.0f) *arr = 1.0f;
|
||||
arr--;
|
||||
}
|
||||
}
|
||||
|
||||
int BKE_mask_get_duration(Mask *mask)
|
||||
{
|
||||
return MAX2(1, mask->efra - mask->sfra);
|
||||
}
|
||||
|
||||
/* rasterization */
|
||||
void BKE_mask_rasterize_layers(ListBase *masklayers, int width, int height, float *buffer,
|
||||
const short do_aspect_correct, const short do_mask_aa,
|
||||
const short do_feather)
|
||||
{
|
||||
MaskLayer *masklay;
|
||||
|
||||
/* temp blending buffer */
|
||||
const int buffer_size = width * height;
|
||||
float *buffer_tmp = MEM_mallocN(sizeof(float) * buffer_size, __func__);
|
||||
|
||||
for (masklay = masklayers->first; masklay; masklay = masklay->next) {
|
||||
MaskSpline *spline;
|
||||
float alpha;
|
||||
|
||||
if (masklay->restrictflag & MASK_RESTRICT_RENDER) {
|
||||
continue;
|
||||
}
|
||||
|
||||
memset(buffer_tmp, 0, sizeof(float) * buffer_size);
|
||||
|
||||
for (spline = masklay->splines.first; spline; spline = spline->next) {
|
||||
float (*diff_points)[2];
|
||||
int tot_diff_point;
|
||||
|
||||
float (*diff_feather_points)[2];
|
||||
int tot_diff_feather_points;
|
||||
|
||||
diff_points = BKE_mask_spline_differentiate_with_resolution(spline, width, height,
|
||||
&tot_diff_point);
|
||||
|
||||
if (tot_diff_point) {
|
||||
if (do_feather) {
|
||||
diff_feather_points =
|
||||
BKE_mask_spline_feather_differentiated_points_with_resolution(spline, width, height,
|
||||
&tot_diff_feather_points);
|
||||
}
|
||||
else {
|
||||
tot_diff_feather_points = 0;
|
||||
diff_feather_points = NULL;
|
||||
}
|
||||
|
||||
if (do_aspect_correct) {
|
||||
if (width != height) {
|
||||
float *fp;
|
||||
float *ffp;
|
||||
int i;
|
||||
float asp;
|
||||
|
||||
if (width < height) {
|
||||
fp = &diff_points[0][0];
|
||||
ffp = tot_diff_feather_points ? &diff_feather_points[0][0] : NULL;
|
||||
asp = (float)width / (float)height;
|
||||
}
|
||||
else {
|
||||
fp = &diff_points[0][1];
|
||||
ffp = tot_diff_feather_points ? &diff_feather_points[0][1] : NULL;
|
||||
asp = (float)height / (float)width;
|
||||
}
|
||||
|
||||
for (i = 0; i < tot_diff_point; i++, fp += 2) {
|
||||
(*fp) = (((*fp) - 0.5f) / asp) + 0.5f;
|
||||
}
|
||||
|
||||
if (tot_diff_feather_points) {
|
||||
for (i = 0; i < tot_diff_feather_points; i++, ffp += 2) {
|
||||
(*ffp) = (((*ffp) - 0.5f) / asp) + 0.5f;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (tot_diff_point) {
|
||||
PLX_raskterize(diff_points, tot_diff_point,
|
||||
buffer_tmp, width, height,do_mask_aa);
|
||||
|
||||
if (tot_diff_feather_points) {
|
||||
PLX_raskterize_feather(diff_points, tot_diff_point,
|
||||
diff_feather_points, tot_diff_feather_points,
|
||||
buffer_tmp, width, height);
|
||||
MEM_freeN(diff_feather_points);
|
||||
}
|
||||
|
||||
MEM_freeN(diff_points);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* blend with original */
|
||||
if (masklay->blend_flag & MASK_BLENDFLAG_INVERT) {
|
||||
/* apply alpha multiply before inverting */
|
||||
if (masklay->alpha != 1.0f) {
|
||||
m_invert_vn_vn(buffer_tmp, masklay->alpha, buffer_size);
|
||||
}
|
||||
else {
|
||||
invert_vn_vn(buffer_tmp, buffer_size);
|
||||
}
|
||||
|
||||
alpha = 1.0f;
|
||||
}
|
||||
else {
|
||||
alpha = masklay->alpha;
|
||||
}
|
||||
|
||||
switch (masklay->blend) {
|
||||
case MASK_BLEND_SUBTRACT:
|
||||
{
|
||||
if (alpha == 1.0f) {
|
||||
sub_vn_vn(buffer, buffer_tmp, buffer_size);
|
||||
}
|
||||
else {
|
||||
msub_vn_vn(buffer, buffer_tmp, alpha, buffer_size);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case MASK_BLEND_ADD:
|
||||
default:
|
||||
{
|
||||
if (alpha == 1.0f) {
|
||||
add_vn_vn(buffer, buffer_tmp, buffer_size);
|
||||
}
|
||||
else {
|
||||
madd_vn_vn(buffer, buffer_tmp, alpha, buffer_size);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (do_mask_aa) {
|
||||
//PLX_antialias_buffer(buffer,width,height);
|
||||
}
|
||||
/* clamp at the end */
|
||||
clamp_vn_vn(buffer, buffer_size);
|
||||
}
|
||||
MEM_freeN(buffer_tmp);
|
||||
}
|
||||
|
||||
#ifdef __PLX_RASKTER_MT__
|
||||
void BKE_mask_init_layers(Mask *mask, struct layer_init_data *mlayer_data, int width, int height, const short do_aspect_correct)
|
||||
{
|
||||
MaskLayer *masklay;
|
||||
int numLayers=0;
|
||||
int currLayer=0;
|
||||
for (masklay = mask->masklayers->first; masklay; masklay = masklay->next) {
|
||||
numLayers++;
|
||||
}
|
||||
mlayer_data = MEM_mallocN(sizeof(struct layer_init_data) * numLayers, __func__); //size correct?
|
||||
|
||||
|
||||
for (masklay = mask->masklayers->first; masklay; masklay = masklay->next) {
|
||||
MaskSpline *spline;
|
||||
for (spline = masklay->splines.first; spline; spline = spline->next) {
|
||||
float (*diff_points)[2];
|
||||
int tot_diff_point;
|
||||
|
||||
float (*diff_feather_points)[2];
|
||||
int tot_diff_feather_points;
|
||||
|
||||
diff_points = BKE_mask_spline_differentiate_with_resolution(spline, width, height,
|
||||
&tot_diff_point);
|
||||
|
||||
if (tot_diff_point) {
|
||||
if (do_feather) {
|
||||
diff_feather_points =
|
||||
BKE_mask_spline_feather_differentiated_points_with_resolution(spline, width, height,
|
||||
&tot_diff_feather_points);
|
||||
}
|
||||
else {
|
||||
tot_diff_feather_points = 0;
|
||||
diff_feather_points = NULL;
|
||||
}
|
||||
|
||||
if (do_aspect_correct) {
|
||||
if (width != height) {
|
||||
float *fp;
|
||||
float *ffp;
|
||||
int i;
|
||||
float asp;
|
||||
|
||||
if (width < height) {
|
||||
fp = &diff_points[0][0];
|
||||
ffp = tot_diff_feather_points ? &diff_feather_points[0][0] : NULL;
|
||||
asp = (float)width / (float)height;
|
||||
}
|
||||
else {
|
||||
fp = &diff_points[0][1];
|
||||
ffp = tot_diff_feather_points ? &diff_feather_points[0][1] : NULL;
|
||||
asp = (float)height / (float)width;
|
||||
}
|
||||
|
||||
for (i = 0; i < tot_diff_point; i++, fp += 2) {
|
||||
(*fp) = (((*fp) - 0.5f) / asp) + 0.5f;
|
||||
}
|
||||
|
||||
if (tot_diff_feather_points) {
|
||||
for (i = 0; i < tot_diff_feather_points; i++, ffp += 2) {
|
||||
(*ffp) = (((*ffp) - 0.5f) / asp) + 0.5f;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
PLX_init_base_data(mlayer_data[currLayer], diff_points, tot_diff_points, width, height);
|
||||
currLayer++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void BKE_mask_rasterize(Mask *mask, int width, int height, float *buffer,
|
||||
const short do_aspect_correct, const short do_mask_aa,
|
||||
const short do_feather)
|
||||
{
|
||||
BKE_mask_rasterize_layers(&mask->masklayers, width, height, buffer, do_aspect_correct, do_mask_aa, do_feather);
|
||||
return maxi(1, mask->efra - mask->sfra);
|
||||
}
|
||||
|
@ -45,8 +45,6 @@
|
||||
|
||||
#include "BKE_mask.h"
|
||||
|
||||
#ifndef USE_RASKTER
|
||||
|
||||
/* this is rather and annoying hack, use define to isolate it.
|
||||
* problem is caused by scanfill removing edges on us. */
|
||||
#define USE_SCANFILL_EDGE_WORKAROUND
|
||||
@ -1317,5 +1315,3 @@ void BKE_maskrasterize_buffer(MaskRasterHandle *mr_handle,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* USE_RASKTER */
|
||||
|
@ -30,107 +30,10 @@
|
||||
|
||||
#include "DNA_scene_types.h"
|
||||
|
||||
#ifdef USE_RASKTER
|
||||
|
||||
extern "C" {
|
||||
#include "../../../../intern/raskter/raskter.h"
|
||||
#include "BKE_mask.h"
|
||||
}
|
||||
|
||||
MaskOperation::MaskOperation() : NodeOperation()
|
||||
{
|
||||
this->addOutputSocket(COM_DT_VALUE);
|
||||
this->m_mask = NULL;
|
||||
this->m_maskWidth = 0;
|
||||
this->m_maskHeight = 0;
|
||||
this->m_framenumber = 0;
|
||||
this->m_rasterizedMask = NULL;
|
||||
setComplex(true);
|
||||
}
|
||||
|
||||
void MaskOperation::initExecution()
|
||||
{
|
||||
initMutex();
|
||||
|
||||
this->m_rasterizedMask = NULL;
|
||||
this->m_maskLayers.first = this->m_maskLayers.last = NULL;
|
||||
|
||||
if (this->m_mask) {
|
||||
BKE_mask_layer_copy_list(&this->m_maskLayers, &this->m_mask->masklayers);
|
||||
}
|
||||
}
|
||||
|
||||
void MaskOperation::deinitExecution()
|
||||
{
|
||||
BKE_mask_layer_free_list(&this->m_maskLayers);
|
||||
|
||||
if (this->m_rasterizedMask) {
|
||||
MEM_freeN(this->m_rasterizedMask);
|
||||
this->m_rasterizedMask = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void *MaskOperation::initializeTileData(rcti *rect)
|
||||
{
|
||||
if (this->m_rasterizedMask)
|
||||
return this->m_rasterizedMask;
|
||||
|
||||
if (!this->m_mask)
|
||||
return NULL;
|
||||
|
||||
lockMutex();
|
||||
if (this->m_rasterizedMask == NULL) {
|
||||
int width = this->getWidth();
|
||||
int height = this->getHeight();
|
||||
float *buffer;
|
||||
|
||||
buffer = (float *)MEM_callocN(sizeof(float) * width * height, "rasterized mask");
|
||||
|
||||
BKE_mask_rasterize_layers(&this->m_maskLayers, width, height, buffer, TRUE,
|
||||
this->m_do_smooth, this->m_do_feather);
|
||||
|
||||
if (this->m_do_smooth) {
|
||||
PLX_antialias_buffer(buffer, width, height);
|
||||
}
|
||||
|
||||
this->m_rasterizedMask = buffer;
|
||||
}
|
||||
unlockMutex();
|
||||
return this->m_rasterizedMask;
|
||||
}
|
||||
|
||||
void MaskOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[])
|
||||
{
|
||||
if (this->m_maskWidth == 0 || this->m_maskHeight == 0) {
|
||||
NodeOperation::determineResolution(resolution, preferredResolution);
|
||||
}
|
||||
else {
|
||||
unsigned int nr[2];
|
||||
|
||||
nr[0] = this->m_maskWidth;
|
||||
nr[1] = this->m_maskHeight;
|
||||
|
||||
NodeOperation::determineResolution(resolution, nr);
|
||||
|
||||
resolution[0] = this->m_maskWidth;
|
||||
resolution[1] = this->m_maskHeight;
|
||||
}
|
||||
}
|
||||
|
||||
void MaskOperation::executePixel(float *color, int x, int y, void *data)
|
||||
{
|
||||
if (!data) {
|
||||
color[0] = 0.0f;
|
||||
}
|
||||
else {
|
||||
float *buffer = (float *) data;
|
||||
int index = (y * this->getWidth() + x);
|
||||
|
||||
color[0] = buffer[index];
|
||||
}
|
||||
}
|
||||
|
||||
#else /* mask rasterizer by campbell wip */
|
||||
|
||||
MaskOperation::MaskOperation() : NodeOperation()
|
||||
{
|
||||
this->addOutputSocket(COM_DT_VALUE);
|
||||
@ -252,5 +155,3 @@ void MaskOperation::executePixel(float *color, float x, float y, PixelSampler sa
|
||||
color[0] /= this->m_rasterMaskHandleTot;
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* USE_RASKTER */
|
||||
|
@ -21,14 +21,9 @@
|
||||
* Sergey Sharybin
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _COM_MaskOperation_h
|
||||
#define _COM_MaskOperation_h
|
||||
|
||||
/* XXX, remove when the USE_RASKTER option is also removed */
|
||||
extern "C" {
|
||||
#include "BKE_mask.h"
|
||||
}
|
||||
|
||||
#include "COM_NodeOperation.h"
|
||||
#include "DNA_scene_types.h"
|
||||
@ -36,10 +31,6 @@ extern "C" {
|
||||
#include "BLI_listbase.h"
|
||||
#include "IMB_imbuf_types.h"
|
||||
|
||||
#ifdef __PLX_RASKTER_MT__
|
||||
#include "../../../../intern/raskter/raskter.h"
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Class with implementation of mask rasterization
|
||||
*/
|
||||
@ -60,15 +51,8 @@ protected:
|
||||
bool m_do_smooth;
|
||||
bool m_do_feather;
|
||||
|
||||
#ifdef USE_RASKTER
|
||||
float *m_rasterizedMask;
|
||||
|
||||
ListBase m_maskLayers;
|
||||
|
||||
#else /* USE_RASKTER */
|
||||
struct MaskRasterHandle *m_rasterMaskHandles[32];
|
||||
unsigned int m_rasterMaskHandleTot;
|
||||
#endif /* USE_RASKTER */
|
||||
|
||||
/**
|
||||
* Determine the output resolution. The resolution is retrieved from the Renderer
|
||||
@ -100,12 +84,7 @@ public:
|
||||
void setMotionBlurSamples(int samples) { this->m_rasterMaskHandleTot = max(1, samples); }
|
||||
void setMotionBlurShutter(float shutter) { this->m_frame_shutter = shutter; }
|
||||
|
||||
#ifdef USE_RASKTER
|
||||
void *initializeTileData(rcti *rect);
|
||||
void executePixel(float *color, int x, int y, void *data);
|
||||
#else /* USE_RASKTER */
|
||||
void executePixel(float *color, float x, float y, PixelSampler sampler);
|
||||
#endif /* USE_RASKTER */
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -38,8 +38,6 @@
|
||||
|
||||
#include "node_composite_util.h"
|
||||
|
||||
#include "../../../../intern/raskter/raskter.h"
|
||||
|
||||
/* **************** Translate ******************** */
|
||||
|
||||
static bNodeSocketTemplate cmp_node_mask_out[] = {
|
||||
@ -51,6 +49,7 @@ static void exec(void *data, bNode *node, bNodeStack **UNUSED(in), bNodeStack **
|
||||
{
|
||||
if (node->id) {
|
||||
Mask *mask = (Mask *)node->id;
|
||||
MaskRasterHandle *mr_handle;
|
||||
CompBuf *stackbuf;
|
||||
RenderData *rd = data;
|
||||
float *res;
|
||||
@ -70,13 +69,17 @@ static void exec(void *data, bNode *node, bNodeStack **UNUSED(in), bNodeStack **
|
||||
stackbuf = alloc_compbuf(sx, sy, CB_VAL, TRUE);
|
||||
res = stackbuf->rect;
|
||||
|
||||
BKE_mask_rasterize(mask, sx, sy, res, TRUE,
|
||||
(node->custom1 & CMP_NODEFLAG_MASK_AA) != 0,
|
||||
(node->custom1 & CMP_NODEFLAG_MASK_NO_FEATHER) == 0);
|
||||
/* mask raster begin */
|
||||
mr_handle = BKE_maskrasterize_handle_new();
|
||||
BKE_maskrasterize_handle_init(mr_handle, mask,
|
||||
sx, sy,
|
||||
TRUE,
|
||||
(node->custom1 & CMP_NODEFLAG_MASK_AA) != 0,
|
||||
(node->custom1 & CMP_NODEFLAG_MASK_NO_FEATHER) == 0);
|
||||
BKE_maskrasterize_buffer(mr_handle, sx, sy, res);
|
||||
BKE_maskrasterize_handle_free(mr_handle);
|
||||
/* mask raster end */
|
||||
|
||||
if (node->custom1) {
|
||||
PLX_antialias_buffer(res,sx,sy);
|
||||
}
|
||||
/* pass on output and free */
|
||||
out[0]->data = stackbuf;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user