ed5d4a275bbde9f9eb6e65d629af0ec3663a7f01
[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     double * colormap = NULL;
54     int colormapSize = 0;
55     int * piColormapSize = &colormapSize;
56     int datatype = -1;
57     int * pidataType = &datatype;
58     const int h = getTextureHeight(id);
59     const int w = getTextureWidth(id);
60
61     getGraphicObjectProperty(id, __GO_DATA_MODEL_Z__, jni_double_vector, &data);
62     getGraphicObjectProperty(id, __GO_DATA_MODEL_MATPLOT_DATA_TYPE__, jni_int, (void**) &pidataType);
63     getGraphicObjectProperty(id, __GO_PARENT_FIGURE__, jni_string, (void**) &parentFigure);
64     getGraphicObjectProperty(parentFigure, __GO_COLORMAP__, jni_double_vector, (void**) &colormap);
65     getGraphicObjectProperty(parentFigure, __GO_COLORMAP_SIZE__, jni_int, (void**) &piColormapSize);
66
67     switch ((DataType)datatype)
68     {
69         case MATPLOT_HM1_Char :
70         case MATPLOT_Char :
71         {
72             char * index = (char *)data;
73             for (int i = 0 ; i < w * h; i++)
74             {
75                 ColorComputer::getDirectByteColor(index[i] - 1, colormap, colormapSize, &buffer[4 * i], false);
76             }
77
78             break;
79         }
80         case MATPLOT_HM1_UChar :
81         case MATPLOT_UChar :
82         {
83             unsigned char * index = (unsigned char *)data;
84             for (int i = 0 ; i < w * h; i++)
85             {
86                 ColorComputer::getDirectByteColor(index[i] - 1, colormap, colormapSize, &buffer[4 * i], false);
87             }
88
89             break;
90         }
91         case MATPLOT_Int :
92         {
93             int * index = (int *)data;
94             for (int i = 0 ; i < w * h; i++)
95             {
96                 ColorComputer::getDirectByteColor(index[i] - 1, colormap, colormapSize, &buffer[4 * i], false);
97             }
98
99             break;
100         }
101         case MATPLOT_UInt :
102         {
103             unsigned int * index = (unsigned int *)data;
104             for (int i = 0 ; i < w * h; i++)
105             {
106                 ColorComputer::getDirectByteColor(index[i] - 1, colormap, colormapSize, &buffer[4 * i], false);
107             }
108
109             break;
110         }
111         case MATPLOT_Short :
112         {
113             short * index = (short *)data;
114             for (int i = 0 ; i < w * h; i++)
115             {
116                 ColorComputer::getDirectByteColor(index[i] - 1, colormap, colormapSize, &buffer[4 * i], false);
117             }
118
119             break;
120         }
121         case MATPLOT_UShort :
122         {
123             unsigned short * index = (unsigned short *)data;
124             for (int i = 0 ; i < w * h; i++)
125             {
126                 ColorComputer::getDirectByteColor(index[i] - 1, colormap, colormapSize, &buffer[4 * i], false);
127             }
128
129             break;
130         }
131         case MATPLOT_HM1_Double :
132         case MATPLOT_Double :
133         {
134             double * index = (double *)data;
135             for (int i = 0 ; i < w * h ; i++)
136             {
137                 ColorComputer::getDirectByteColor(index[i] - 1, colormap, colormapSize, &buffer[4 * i], false);
138             }
139             break;
140         }
141     }
142
143     releaseGraphicObjectProperty(__GO_COLORMAP__, colormap, jni_double_vector, colormapSize);
144
145     return bufferLength;
146 }
147
148
149 int MatPlotDecomposer::fillTextureData(int id, unsigned char* buffer, int bufferLength, int x, int y, int width, int height)
150 {
151     double* value = NULL;
152     getGraphicObjectProperty(id, __GO_DATA_MODEL_Z__, jni_double_vector, (void**) &value);
153     if (width * height * 4 == bufferLength)
154     {
155         int parentFigure = 0;
156         double* colormap = NULL;
157         int colormapSize = 0;
158         int* piColormapSize = &colormapSize;
159         getGraphicObjectProperty(id, __GO_PARENT_FIGURE__, jni_string, (void**) &parentFigure);
160         getGraphicObjectProperty(parentFigure, __GO_COLORMAP__, jni_double_vector, (void**) &colormap);
161         getGraphicObjectProperty(parentFigure, __GO_COLORMAP_SIZE__, jni_int, (void**) &piColormapSize);
162         int textureHeight = getTextureHeight(id);
163         int k = 0;
164         for (int j = y ; j < y + height ; j++)
165         {
166             for (int i = x ; i < x + width ; i++)
167             {
168                 ColorComputer::getDirectByteColor(value[j + i * textureHeight] - 1, colormap, colormapSize, &buffer[k]);
169                 buffer[k + 3] = 255;
170                 k += 4;
171             }
172         }
173
174         releaseGraphicObjectProperty(__GO_COLORMAP__, colormap, jni_double_vector, colormapSize);
175
176         return bufferLength;
177     }
178     else
179     {
180         return 0;
181     }
182 }
183
184 int MatPlotDecomposer::getTextureImageType(int id)
185 {
186     int type = -1;
187     int * piType = &type;
188     getGraphicObjectProperty(id, __GO_DATA_MODEL_MATPLOT_IMAGE_TYPE__, jni_int, (void**) &piType);
189
190     return type;
191 }
192
193 int MatPlotDecomposer::getTextureDataType(int id)
194 {
195     int type = -1;
196     int * piType = &type;
197     getGraphicObjectProperty(id, __GO_DATA_MODEL_MATPLOT_DATA_TYPE__, jni_int, (void**) &piType);
198
199     return type;
200 }
201
202 int MatPlotDecomposer::getTextureGLType(int id)
203 {
204     int type = -1;
205     int * piType = &type;
206     getGraphicObjectProperty(id, __GO_DATA_MODEL_MATPLOT_GL_TYPE__, jni_int, (void**) &piType);
207
208     return type;
209 }
210
211 int MatPlotDecomposer::getTextureData(int id, void ** address, unsigned int * size)
212 {
213     int type = getTextureImageType(id);
214     if (type == MATPLOT_INDEX)
215     {
216         // Indexed colors
217         const int h = getTextureHeight(id);
218         const int w = getTextureWidth(id);
219         const int bsize = w * h * sizeof(int);
220         unsigned char * buffer = new unsigned char[bsize];
221         fillTextureData(id, buffer, bsize);
222
223         *address = buffer;
224         *size = bsize;
225
226         return 1;
227     }
228
229     getGraphicObjectProperty(id, __GO_DATA_MODEL_MATPLOT_IMAGE_DATA__, jni_double_vector, address);
230     getGraphicObjectProperty(id, __GO_DATA_MODEL_MATPLOT_IMAGE_DATASIZE__, jni_int, (void **)&size);
231
232     return 1;
233 }
234
235 void MatPlotDecomposer::disposeTextureData(int id, unsigned char * buffer)
236 {
237     if (buffer)
238     {
239         delete[] buffer;
240     }
241 }
242
243 int MatPlotDecomposer::isTextureRowOrder(int id)
244 {
245     int rowOrder;
246     int * piRowOrder = &rowOrder;
247     getGraphicObjectProperty(id, __GO_DATA_MODEL_MATPLOT_DATA_ORDER__, jni_int, (void**) &piRowOrder);
248
249     return rowOrder;
250 }
251
252 int buildMatplotType(DataType datatype, DataOrder dataorder, ImageType imagetype)
253 {
254     return ((int)datatype) | ((int)dataorder << 8) | ((int)imagetype << 16);
255 }