Use direct texture drawing for Matplot drawing.
[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  *
5  *  This file must be used under the terms of the CeCILL.
6  *  This source file is licensed as described in the file COPYING, which
7  *  you should have received as part of this distribution.  The terms
8  *  are also available at
9  *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 #include "DecompositionUtils.hxx"
14 #include "MatPlotDecomposer.hxx"
15 #include "DataProperties.hxx"
16 #include "ColorComputer.hxx"
17 #include <iostream>
18
19 extern "C" {
20 #include "getGraphicObjectProperty.h"
21 #include "graphicObjectProperties.h"
22 }
23
24 int MatPlotDecomposer::getTextureWidth(char* id)
25 {
26   int width;
27   int* piWidth = &width;
28   getGraphicObjectProperty(id, __GO_DATA_MODEL_NUM_X__, jni_int, (void**) &piWidth);
29   return width - 1;
30 }
31
32
33 int MatPlotDecomposer::getTextureHeight(char* id)
34 {
35   int height;
36   int* piHeight = &height;
37   getGraphicObjectProperty(id, __GO_DATA_MODEL_NUM_Y__, jni_int, (void**) &piHeight);
38   return height - 1;
39 }
40
41
42 int MatPlotDecomposer::fillTextureData(char* id, float* buffer, int bufferLength)
43 {
44   double* value;
45   getGraphicObjectProperty(id, __GO_DATA_MODEL_Z__, jni_double_vector, (void**) &value);
46   int textureWidth = getTextureWidth(id);
47   int textureHeight = getTextureHeight(id);
48   int dataSize = textureWidth * textureHeight;
49   if (dataSize * 4 == bufferLength)
50   {
51
52     char* parentFigure;
53     double* colormap;
54     int colormapSize;
55     int* piColormapSize = &colormapSize;
56
57     getGraphicObjectProperty(id, __GO_PARENT_FIGURE__, jni_string, (void**) &parentFigure);
58     getGraphicObjectProperty(parentFigure, __GO_COLORMAP__, jni_double_vector, (void**) &colormap);
59     getGraphicObjectProperty(parentFigure, __GO_COLORMAP_SIZE__, jni_int, (void**) &piColormapSize);
60
61     for (int i = 0 ; i < textureWidth ; i++)
62     {
63       for (int j = 0 ; j < textureHeight ; j++)
64       {
65         ColorComputer::getDirectColor(value[j + i * textureHeight] - 1, colormap, colormapSize, &buffer[4 * (i + j * textureWidth)]);
66         buffer[4 * (i + j * textureWidth) + 3] = 1;
67       }
68     }
69
70     return bufferLength;
71   }
72   else
73   {
74     return 0;
75   }
76 }
77
78
79 int MatPlotDecomposer::fillTextureData(char* id, float* buffer, int bufferLength, int x, int y, int width, int height)
80 {
81   double* value;
82   getGraphicObjectProperty(id, __GO_DATA_MODEL_Z__, jni_double_vector, (void**) &value);
83   if (width * height * 4 == bufferLength)
84   {
85     char* parentFigure;
86     double* colormap;
87     int colormapSize;
88     int* piColormapSize = &colormapSize;
89     getGraphicObjectProperty(id, __GO_PARENT_FIGURE__, jni_string, (void**) &parentFigure);
90     getGraphicObjectProperty(parentFigure, __GO_COLORMAP__, jni_double_vector, (void**) &colormap);
91     getGraphicObjectProperty(parentFigure, __GO_COLORMAP_SIZE__, jni_int, (void**) &piColormapSize);
92     int textureHeight = getTextureHeight(id);
93     int k = 0;
94     for (int j = y ; j < y + height ; j++)
95     {
96       for (int i = x ; i < x + width ; i++)
97       {
98         ColorComputer::getDirectColor(value[j + i * textureHeight] - 1, colormap, colormapSize, &buffer[k]);
99         buffer[k + 3] = 1;
100         k += 4;
101       }
102     }
103     return bufferLength;
104   }
105   else
106   {
107     return 0;
108   }
109 }
110