Update figure function :
[scilab.git] / scilab / modules / gui / src / c / addColor.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2014 - Scilab Enterprises - Antoine ELIAS
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.1-en.txt
10  *
11  */
12 #include "addColor.h"
13 #include "string.h"
14 #include "setGraphicObjectProperty.h"
15 #include "getGraphicObjectProperty.h"
16 #include "graphicObjectProperties.h"
17
18 #include "MALLOC.h"
19
20 int addColor(int _iFig, double* _pdblNewColor)
21 {
22     int iColorIndex = 0;
23     int i = 0, j = 0;
24     int iColorMapSize = 0;
25     int* piColorMapSize = &iColorMapSize;
26     double* pdblColorMap = NULL;
27     //for new figure, we have to set figure and axes background to [0.8 0.8 0.8]
28     //to do that, we have to update figure.colormap to add new color if not exist.
29     //or get index of color in current color_map
30
31     //first get figure.color_map
32     getGraphicObjectProperty(_iFig, __GO_COLORMAP_SIZE__, jni_int, (void**)&piColorMapSize);
33     getGraphicObjectProperty(_iFig, __GO_COLORMAP__, jni_double_vector, (void **)&pdblColorMap);
34
35     //check if newColor already in coloMap
36     for (i = 0 ; i < iColorMapSize ; i++)
37     {
38         BOOL bFound = TRUE;
39         double* pdblCurrentColor = pdblColorMap + i;
40         for (j = 0 ; j < COLOR_COMPONENT ; j++)
41         {
42             if (*(pdblCurrentColor + j * iColorMapSize) != _pdblNewColor[j])
43             {
44                 bFound = FALSE;
45                 break;
46             }
47         }
48
49         if (bFound)
50         {
51             iColorIndex = i + 1;
52             break;
53         }
54     }
55
56     //not found in current color map
57     if (iColorIndex == 0)
58     {
59         int iNewColorMapSize = (iColorMapSize + 1) * COLOR_COMPONENT;
60         double* pdblNewColorMap = (double*)MALLOC(sizeof(double) * iNewColorMapSize);
61         //we have to add the new color at the end of the current color map
62         for (i = 0 ; i < COLOR_COMPONENT ; i++)
63         {
64             memcpy(pdblNewColorMap + i * (iColorMapSize + 1),
65                    pdblColorMap + (i * iColorMapSize),
66                    iColorMapSize * sizeof(double));
67
68             pdblNewColorMap[i * (iColorMapSize + 1) + iColorMapSize] = _pdblNewColor[i];
69         }
70
71         setGraphicObjectProperty(_iFig, __GO_COLORMAP__, pdblNewColorMap, jni_double_vector, iNewColorMapSize);
72
73         iColorIndex = iColorMapSize + 1;
74     }
75     return iColorIndex;
76 }