optionally use guarded alloc for tiles compositor, also replace allocation functions...
[blender.git] / source / blender / compositor / intern / COM_SocketReader.h
1 /*
2  * Copyright 2011, Blender Foundation.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * Contributor: 
19  *              Jeroen Bakker 
20  *              Monique Dewanchand
21  */
22
23 #ifndef _COM_SocketReader_h
24 #define _COM_SocketReader_h
25 #include "BLI_rect.h"
26 #include "COM_defines.h"
27
28 typedef enum PixelSampler {
29         COM_PS_NEAREST,
30         COM_PS_BILINEAR,
31         COM_PS_BICUBIC
32 } PixelSampler;
33
34 class MemoryBuffer;
35 /**
36  * @brief Helper class for reading socket data.
37  * Only use this class for dispatching (un-ary and n-ary) executions.
38  * @ingroup Execution
39  */
40 class SocketReader {
41 private:
42 protected:
43         /**
44          * @brief Holds the width of the output of this operation.
45          */
46         unsigned int width;
47
48         /**
49          * @brief Holds the height of the output of this operation.
50          */
51         unsigned int height;
52
53
54         /**
55          * @brief calculate a single pixel
56          * @note this method is called for non-complex
57          * @param result is a float[4] array to store the result
58          * @param x the x-coordinate of the pixel to calculate in image space
59          * @param y the y-coordinate of the pixel to calculate in image space
60          * @param inputBuffers chunks that can be read by their ReadBufferOperation.
61          */
62         virtual void executePixel(float *result, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) {}
63
64         /**
65          * @brief calculate a single pixel
66          * @note this method is called for complex
67          * @param result is a float[4] array to store the result
68          * @param x the x-coordinate of the pixel to calculate in image space
69          * @param y the y-coordinate of the pixel to calculate in image space
70          * @param inputBuffers chunks that can be read by their ReadBufferOperation.
71          * @param chunkData chunk specific data a during execution time.
72          */
73         virtual void executePixel(float *result, int x, int y, MemoryBuffer *inputBuffers[], void *chunkData) {
74                 executePixel(result, x, y, COM_PS_NEAREST, inputBuffers);
75         }
76
77         /**
78          * @brief calculate a single pixel using an EWA filter
79          * @note this method is called for complex
80          * @param result is a float[4] array to store the result
81          * @param x the x-coordinate of the pixel to calculate in image space
82          * @param y the y-coordinate of the pixel to calculate in image space
83          * @param dx
84          * @param dy
85          * @param inputBuffers chunks that can be read by their ReadBufferOperation.
86          */
87         virtual void executePixel(float *result, float x, float y, float dx, float dy, MemoryBuffer *inputBuffers[]) {}
88
89 public:
90         inline void read(float *result, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) {
91                 executePixel(result, x, y, sampler, inputBuffers);
92         }
93         inline void read(float *result, int x, int y, MemoryBuffer *inputBuffers[], void *chunkData) {
94                 executePixel(result, x, y, inputBuffers, chunkData);
95         }
96         inline void read(float *result, float x, float y, float dx, float dy, MemoryBuffer *inputBuffers[]) {
97                 executePixel(result, x, y, dx, dy, inputBuffers);
98         }
99
100         virtual void *initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers) { return 0; }
101         virtual void deinitializeTileData(rcti *rect, MemoryBuffer **memoryBuffers, void *data) {
102         }
103         
104         virtual MemoryBuffer *getInputMemoryBuffer(MemoryBuffer **memoryBuffers) { return 0; }
105
106
107         inline const unsigned int getWidth() const { return this->width; }
108         inline const unsigned int getHeight() const { return this->height; }
109
110 #ifdef WITH_CXX_GUARDEDALLOC
111         MEM_CXX_CLASS_ALLOC_FUNCS("COM:SocketReader")
112 #endif
113 };
114
115 #endif /* _COM_SocketReader_h */