Graphics: Matplot broken after uid refactor
[scilab.git] / scilab / modules / graphic_objects / src / cpp / MatPlotDecomposer.cpp
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2011-2012 - DIGITEO - Pierre Lando
4  *  Copyright (C) 2013 - Scilab Enterprises - Calixte DENIZET
5  *
6  *  This file must be used under the terms of the CeCILL.
7  *  This source file is licensed as described in the file COPYING, which
8  *  you should have received as part of this distribution.  The terms
9  *  are also available at
10  *  http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
11  *
12  */
13
14 #include "DecompositionUtils.hxx"
15 #include "MatPlotDecomposer.hxx"
16 #include "DataProperties.hxx"
17 #include "ColorComputer.hxx"
18 #include <iostream>
19 #include <cstring>
20
21 extern "C" {
22 #include "getGraphicObjectProperty.h"
23 #include "setGraphicObjectProperty.h"
24 #include "graphicObjectProperties.h"
25 #include "Matplot.h"
26 }
27
28 int MatPlotDecomposer::getTextureWidth(int id)
29 {
30     int width = 0;
31     int* piWidth = &width;
32     getGraphicObjectProperty(id, __GO_DATA_MODEL_NUM_X__, jni_int, (void**) &piWidth);
33
34     return width - 1;
35 }
36
37
38 int MatPlotDecomposer::getTextureHeight(int id)
39 {
40     int height = 0;
41     int* piHeight = &height;
42     getGraphicObjectProperty(id, __GO_DATA_MODEL_NUM_Y__, jni_int, (void**) &piHeight);
43
44     return height - 1;
45 }
46
47
48 int MatPlotDecomposer::fillTextureData(int id, unsigned char* buffer, int bufferLength)
49 {
50     // Indexed colors
51     void * data = NULL;
52     int parentFigure = 0;
53     int * piParentFigure = &parentFigure;
54     double * colormap = NULL;
55     int colormapSize = 0;
56     int * piColormapSize = &colormapSize;
57     int datatype = -1;
58     int * pidataType = &datatype;
59     const int h = getTextureHeight(id);
60     const int w = getTextureWidth(id);
61
62     getGraphicObjectProperty(id, __GO_DATA_MODEL_Z__, jni_double_vector, &data);
63     getGraphicObjectProperty(id, __GO_DATA_MODEL_MATPLOT_DATA_TYPE__, jni_int, (void**) &pidataType);
64     getGraphicObjectProperty(id, __GO_PARENT_FIGURE__, jni_int, (void**) &piParentFigure);
65     getGraphicObjectProperty(parentFigure, __GO_COLORMAP__, jni_double_vector, (void**) &colormap);
66     getGraphicObjectProperty(parentFigure, __GO_COLORMAP_SIZE__, jni_int, (void**) &piColormapSize);
67
68     switch ((DataType)datatype)
69     {
70         case MATPLOT_HM1_Char :
71         case MATPLOT_Char :
72         {
73             char * index = (char *)data;
74             for (int i = 0 ; i < w * h; i++)
75             {
76                 ColorComputer::getDirectByteColor(index[i] - 1, colormap, colormapSize, &buffer[4 * i], false);
77             }
78
79             break;
80         }
81         case MATPLOT_HM1_UChar :
82         case MATPLOT_UChar :
83         {
84             unsigned char * index = (unsigned char *)data;
85             for (int i = 0 ; i < w * h; i++)
86             {
87                 ColorComputer::getDirectByteColor(index[i] - 1, colormap, colormapSize, &buffer[4 * i], false);
88             }
89
90             break;
91         }
92         case MATPLOT_Int :
93         {
94             int * index = (int *)data;
95             for (int i = 0 ; i < w * h; i++)
96             {
97                 ColorComputer::getDirectByteColor(index[i] - 1, colormap, colormapSize, &buffer[4 * i], false);
98             }
99
100             break;
101         }
102         case MATPLOT_UInt :
103         {
104             unsigned int * index = (unsigned int *)data;
105             for (int i = 0 ; i < w * h; i++)
106             {
107                 ColorComputer::getDirectByteColor(index[i] - 1, colormap, colormapSize, &buffer[4 * i], false);
108             }
109
110             break;
111         }
112         case MATPLOT_Short :
113         {
114             short * index = (short *)data;
115             for (int i = 0 ; i < w * h; i++)
116             {
117                 ColorComputer::getDirectByteColor(index[i] - 1, colormap, colormapSize, &buffer[4 * i], false);
118             }
119
120             break;
121         }
122         case MATPLOT_UShort :
123         {
124             unsigned short * index = (unsigned short *)data;
125             for (int i = 0 ; i < w * h; i++)
126             {
127                 ColorComputer::getDirectByteColor(index[i] - 1, colormap, colormapSize, &buffer[4 * i], false);
128             }
129
130             break;
131         }
132         case MATPLOT_HM1_Double :
133         case MATPLOT_Double :
134         {
135             double * index = (double *)data;
136             for (int i = 0 ; i < w * h ; i++)
137             {
138                 ColorComputer::getDirectByteColor(index[i] - 1, colormap, colormapSize, &buffer[4 * i], false);
139             }
140             break;
141         }
142     }
143
144     releaseGraphicObjectProperty(__GO_COLORMAP__, colormap, jni_double_vector, colormapSize);
145
146     return bufferLength;
147 }
148
149
150 int MatPlotDecomposer::fillTextureData(int id, unsigned char* buffer, int bufferLength, int x, int y, int width, int height)
151 {
152     double* value = NULL;
153     getGraphicObjectProperty(id, __GO_DATA_MODEL_Z__, jni_double_vector, (void**) &value);
154     if (width * height * 4 == bufferLength)
155     {
156         int parentFigure = 0;
157         int * piParentFigure = &parentFigure;
158         double* colormap = NULL;
159         int colormapSize = 0;
160         int* piColormapSize = &colormapSize;
161         getGraphicObjectProperty(id, __GO_PARENT_FIGURE__, jni_int, (void**) &piParentFigure);
162         getGraphicObjectProperty(parentFigure, __GO_COLORMAP__, jni_double_vector, (void**) &colormap);
163         getGraphicObjectProperty(parentFigure, __GO_COLORMAP_SIZE__, jni_int, (void**) &piColormapSize);
164         int textureHeight = getTextureHeight(id);
165         int k = 0;
166         for (int j = y ; j < y + height ; j++)
167         {
168             for (int i = x ; i < x + width ; i++)
169             {
170                 ColorComputer::getDirectByteColor(value[j + i * textureHeight] - 1, colormap, colormapSize, &buffer[k]);
171                 buffer[k + 3] = 255;
172                 k += 4;
173             }
174         }
175
176         releaseGraphicObjectProperty(__GO_COLORMAP__, colormap, jni_double_vector, colormapSize);
177
178         return bufferLength;
179     }
180     else
181     {
182         return 0;
183     }
184 }
185
186 int MatPlotDecomposer::getTextureImageType(int id)
187 {
188     int type = -1;
189     int * piType = &type;
190     getGraphicObjectProperty(id, __GO_DATA_MODEL_MATPLOT_IMAGE_TYPE__, jni_int, (void**) &piType);
191
192     return type;
193 }
194
195 int MatPlotDecomposer::getTextureDataType(int id)
196 {
197     int type = -1;
198     int * piType = &type;
199     getGraphicObjectProperty(id, __GO_DATA_MODEL_MATPLOT_DATA_TYPE__, jni_int, (void**) &piType);
200
201     return type;
202 }
203
204 int MatPlotDecomposer::getTextureGLType(int id)
205 {
206     int type = -1;
207     int * piType = &type;
208     getGraphicObjectProperty(id, __GO_DATA_MODEL_MATPLOT_GL_TYPE__, jni_int, (void**) &piType);
209
210     return type;
211 }
212
213 int MatPlotDecomposer::getTextureData(int id, void ** address, unsigned int * size)
214 {
215     int type = getTextureImageType(id);
216     if (type == MATPLOT_INDEX)
217     {
218         // Indexed colors
219         const int h = getTextureHeight(id);
220         const int w = getTextureWidth(id);
221         const int bsize = w * h * sizeof(int);
222         unsigned char * buffer = new unsigned char[bsize];
223         fillTextureData(id, buffer, bsize);
224
225         *address = buffer;
226         *size = bsize;
227
228         return 1;
229     }
230
231     getGraphicObjectProperty(id, __GO_DATA_MODEL_MATPLOT_IMAGE_DATA__, jni_double_vector, address);
232     getGraphicObjectProperty(id, __GO_DATA_MODEL_MATPLOT_IMAGE_DATASIZE__, jni_int, (void **)&size);
233
234     return 1;
235 }
236
237 void MatPlotDecomposer::disposeTextureData(int id, unsigned char * buffer)
238 {
239     if (buffer)
240     {
241         delete[] buffer;
242     }
243 }
244
245 int MatPlotDecomposer::isTextureRowOrder(int id)
246 {
247     int rowOrder;
248     int * piRowOrder = &rowOrder;
249     getGraphicObjectProperty(id, __GO_DATA_MODEL_MATPLOT_DATA_ORDER__, jni_int, (void**) &piRowOrder);
250
251     return rowOrder;
252 }
253
254 int buildMatplotType(DataType datatype, DataOrder dataorder, ImageType imagetype)
255 {
256     return ((int)datatype) | ((int)dataorder << 8) | ((int)imagetype << 16);
257 }