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:
Diffstat (limited to 'source/blender/compositor/intern/COM_MemoryBuffer.h')
-rw-r--r--source/blender/compositor/intern/COM_MemoryBuffer.h170
1 files changed, 170 insertions, 0 deletions
diff --git a/source/blender/compositor/intern/COM_MemoryBuffer.h b/source/blender/compositor/intern/COM_MemoryBuffer.h
new file mode 100644
index 00000000000..78fb16a7b12
--- /dev/null
+++ b/source/blender/compositor/intern/COM_MemoryBuffer.h
@@ -0,0 +1,170 @@
+/*
+ * Copyright 2011, 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
+ */
+
+class MemoryBuffer;
+
+#ifndef _COM_MemoryBuffer_h_
+#define _COM_MemoryBuffer_h_
+
+#include "COM_ExecutionGroup.h"
+#include "BLI_rect.h"
+#include "COM_MemoryProxy.h"
+extern "C" {
+ #include "BLI_threads.h"
+}
+#include <vector>
+
+/**
+ * @brief state of a memory buffer
+ * @ingroup Memory
+ */
+typedef enum MemoryBufferState {
+ /** @brief memory has been allocated on creator device and CPU machine, but kernel has not been executed */
+ COM_MB_ALLOCATED = 1,
+ /** @brief memory is available for use, content has been created */
+ COM_MB_AVAILABLE = 2,
+ /** @brief chunk is consolidated from other chunks. special state.*/
+ COM_MB_TEMPORARILY = 6
+} MemoryBufferState;
+
+class MemoryProxy;
+
+/**
+ * @brief a MemoryBuffer contains access to the data of a chunk
+ */
+class MemoryBuffer {
+private:
+ /**
+ * @brief proxy of the memory (same for all chunks in the same buffer)
+ */
+ MemoryProxy * memoryProxy;
+
+ /**
+ * @brief the type of buffer COM_DT_VALUE, COM_DT_VECTOR, COM_DT_COLOR
+ */
+ DataType datatype;
+
+
+ /**
+ * @brief region of this buffer inside reative to the MemoryProxy
+ */
+ rcti rect;
+
+ /**
+ * brief refers to the chunknumber within the executiongroup where related to the MemoryProxy
+ * @see memoryProxy
+ */
+ unsigned int chunkNumber;
+
+ /**
+ * @brief width of the chunk
+ */
+ unsigned int chunkWidth;
+
+ /**
+ * @brief state of the buffer
+ */
+ MemoryBufferState state;
+
+ /**
+ * @brief the actual float buffer/data
+ */
+ float* buffer;
+
+public:
+ /**
+ * @brief construct new MemoryBuffer for a chunk
+ */
+ MemoryBuffer(MemoryProxy *memoryProxy, unsigned int chunkNumber, rcti* rect);
+
+ /**
+ * @brief construct new temporarily MemoryBuffer for an area
+ */
+ MemoryBuffer(MemoryProxy *memoryProxy, rcti* rect);
+
+ /**
+ * @brief destructor
+ */
+ ~MemoryBuffer();
+
+ /**
+ * @brief read the ChunkNumber of this MemoryBuffer
+ */
+ unsigned int getChunkNumber() {return this->chunkNumber;}
+
+ /**
+ * @brief get the data of this MemoryBuffer
+ * @note buffer should already be available in memory
+ */
+ float* getBuffer() {return this->buffer;}
+
+ /**
+ * @brief after execution the state will be set to available by calling this method
+ */
+ void setCreatedState() {
+ this->state = COM_MB_AVAILABLE;
+ }
+
+ void read(float* result, int x, int y);
+ void writePixel(int x, int y, float color[4]);
+ void readCubic(float* result, float x, float y);
+ void readEWA(float *result, float fx, float fy, float dx, float dy);
+
+ /**
+ * @brief is this MemoryBuffer a temporarily buffer (based on an area, not on a chunk)
+ */
+ inline const bool isTemporarily() const {return this->state == COM_MB_TEMPORARILY;}
+
+ /**
+ * @brief add the content from otherBuffer to this MemoryBuffer
+ * @param otherBuffer source buffer
+ */
+ void copyContentFrom(MemoryBuffer* otherBuffer);
+
+ /**
+ * @brief get the rect of this MemoryBuffer
+ */
+ rcti* getRect() {return &this->rect;}
+
+ /**
+ * @brief get the width of this MemoryBuffer
+ */
+ int getWidth() const;
+
+ /**
+ * @brief get the height of this MemoryBuffer
+ */
+ int getHeight() const;
+
+ /**
+ * @brief clear the buffer. Make all pixels black transparant.
+ */
+ void clear();
+
+ MemoryBuffer* duplicate();
+
+ float* convertToValueBuffer();
+private:
+ unsigned int determineBufferSize();
+};
+
+#endif