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>2012-06-04 19:49:58 +0400
committerCampbell Barton <ideasman42@gmail.com>2012-06-04 19:49:58 +0400
commit489fa2d108783e1f254a367293529b272cc53d31 (patch)
treebba65cb87767fa45f88bc7519abef83ca79ba681 /source/blender/compositor/operations
parent070d2122b00df3442c6c5b00b9be02534df680aa (diff)
remaining mask files from tomato. these wont get svn history carried over.
Diffstat (limited to 'source/blender/compositor/operations')
-rw-r--r--source/blender/compositor/operations/COM_MaskOperation.cpp124
-rw-r--r--source/blender/compositor/operations/COM_MaskOperation.h66
2 files changed, 190 insertions, 0 deletions
diff --git a/source/blender/compositor/operations/COM_MaskOperation.cpp b/source/blender/compositor/operations/COM_MaskOperation.cpp
new file mode 100644
index 00000000000..a742306f440
--- /dev/null
+++ b/source/blender/compositor/operations/COM_MaskOperation.cpp
@@ -0,0 +1,124 @@
+/*
+ * Copyright 2012, Blender Foundation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor:
+ * Jeroen Bakker
+ * Monique Dewanchand
+ * Sergey Sharybin
+ */
+
+#include "COM_MaskOperation.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_listbase.h"
+#include "BLI_math.h"
+
+#include "DNA_scene_types.h"
+
+extern "C" {
+ #include "BKE_mask.h"
+}
+
+MaskOperation::MaskOperation(): NodeOperation()
+{
+ this->addInputSocket(COM_DT_COLOR);
+ this->addOutputSocket(COM_DT_COLOR);
+ this->mask = NULL;
+ this->maskWidth = 0;
+ this->maskHeight = 0;
+ this->framenumber = 0;
+ this->rasterizedMask = NULL;
+ setComplex(true);
+}
+
+void MaskOperation::initExecution()
+{
+ initMutex();
+ this->rasterizedMask = NULL;
+}
+
+void MaskOperation::deinitExecution()
+{
+ if (this->rasterizedMask) {
+ MEM_freeN(rasterizedMask);
+ this->rasterizedMask = NULL;
+ }
+}
+
+void *MaskOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers)
+{
+ if (this->rasterizedMask)
+ return this->rasterizedMask;
+
+ if (!this->mask)
+ return NULL;
+
+ BLI_mutex_lock(getMutex());
+ if (this->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(mask, width, height, buffer);
+
+ this->rasterizedMask = buffer;
+ }
+ BLI_mutex_unlock(getMutex());
+
+ return this->rasterizedMask;
+}
+
+void MaskOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[])
+{
+ if (maskWidth == 0 || maskHeight == 0) {
+ NodeOperation::determineResolution(resolution, preferredResolution);
+ }
+ else {
+ unsigned int nr[2];
+
+ nr[0] = maskWidth;
+ nr[1] = maskHeight;
+
+ NodeOperation::determineResolution(resolution, nr);
+
+ resolution[0] = maskWidth;
+ resolution[1] = maskHeight;
+ }
+}
+
+void MaskOperation::executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data)
+{
+ if (!data) {
+ color[0] = 0;
+ color[1] = 0;
+ color[2] = 0;
+ color[3] = 1.0f;
+ }
+ else {
+ float *buffer = (float*) data;
+ int index = (y * this->getWidth() + x);
+
+ color[0] = buffer[index];
+ color[1] = buffer[index];
+ color[2] = buffer[index];
+ color[3] = 1.0f;
+ }
+}
+
+
diff --git a/source/blender/compositor/operations/COM_MaskOperation.h b/source/blender/compositor/operations/COM_MaskOperation.h
new file mode 100644
index 00000000000..9f2c7f53f56
--- /dev/null
+++ b/source/blender/compositor/operations/COM_MaskOperation.h
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2012, Blender Foundation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor:
+ * Jeroen Bakker
+ * Monique Dewanchand
+ * Sergey Sharybin
+ */
+
+
+#ifndef _COM_MaskOperation_h
+#define _COM_MaskOperation_h
+
+#include "COM_NodeOperation.h"
+#include "DNA_scene_types.h"
+#include "DNA_mask_types.h"
+#include "BLI_listbase.h"
+#include "IMB_imbuf_types.h"
+
+/**
+ * Class with implementation of mask rasterization
+ */
+class MaskOperation : public NodeOperation {
+protected:
+ Mask *mask;
+ int maskWidth;
+ int maskHeight;
+ int framenumber;
+ float *rasterizedMask;
+
+ /**
+ * Determine the output resolution. The resolution is retrieved from the Renderer
+ */
+ void determineResolution(unsigned int resolution[], unsigned int preferredResolution[]);
+
+public:
+ MaskOperation();
+
+ void initExecution();
+ void deinitExecution();
+
+ void *initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers);
+
+ void setMask(Mask *mask) {this->mask = mask;}
+ void setMaskWidth(int width) {this->maskWidth = width;}
+ void setMaskHeight(int height) {this->maskHeight = height;}
+ void setFramenumber(int framenumber) {this->framenumber = framenumber;}
+
+ void executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data);
+};
+
+#endif