Fix memleaks and slightly improve perfs
[scilab.git] / scilab / modules / graphics / sci_gateway / c / sci_xrects.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2006 - ENPC - Jean-Philipe Chancelier
4  * Copyright (C) 2006 - INRIA - Fabrice Leray
5  * Copyright (C) 2006 - INRIA - Jean-Baptiste Silvy
6  * Copyright (C) 2011 - DIGITEO - Bruno JOFRET
7  *
8  * This file must be used under the terms of the CeCILL.
9  * This source file is licensed as described in the file COPYING, which
10  * you should have received as part of this distribution.  The terms
11  * are also available at
12  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
13  *
14  */
15
16 /*------------------------------------------------------------------------*/
17 /* file: sci_xrects.c                                                     */
18 /* desc : interface for xrects routine                                    */
19 /*------------------------------------------------------------------------*/
20
21 #include "gw_graphics.h"
22 #include "stack-c.h"
23 #include "BuildObjects.h"
24 #include "sciCall.h"
25 #include "DrawObjects.h"
26 #include "GetProperty.h"
27 #include "localization.h"
28 #include "Scierror.h"
29 #include "HandleManagement.h"
30
31 #include "createGraphicObject.h"
32 #include "setGraphicObjectProperty.h"
33 #include "getGraphicObjectProperty.h"
34 #include "graphicObjectProperties.h"
35 #include "CurrentObject.h"
36 /*--------------------------------------------------------------------------*/
37 int sci_xrects( char *fname, unsigned long fname_len )
38 {
39     int m1 = 0, n1 = 0, l1 = 0, m2 = 0, n2 = 0, l2 = 0;
40     long  hdl = 0;
41     int i = 0;
42     char* psubwinUID = NULL;
43
44     int foreground = 0;
45     int *piForeground = &foreground;
46     char *pstCompoundUID = NULL;
47
48     CheckRhs(1, 2);
49
50     GetRhsVar(1, MATRIX_OF_DOUBLE_DATATYPE, &m1, &n1, &l1);
51
52     if (m1 != 4)
53     {
54         Scierror(999, _("%s: Wrong size for input argument #%d: %s expected.\n"), fname, 1, "(4,n)");
55         return 0;
56     }
57
58
59     if (Rhs == 2)
60     {
61         GetRhsVar(2, MATRIX_OF_INTEGER_DATATYPE, &m2, &n2, &l2);
62         CheckVector(2, m2, n2);
63         if (m2 * n2 != n1)
64         {
65             Scierror(999, _("%s: Incompatible length for input arguments #%d and #%d.\n"), fname, 1, 2);
66             return 0;
67         }
68     }
69     else
70     {
71         m2 = 1, n2 = n1;
72         CreateVar(2, MATRIX_OF_INTEGER_DATATYPE, &m2, &n2, &l2);
73         for (i = 0; i < n2; ++i)
74         {
75             *istk(l2 + i) = 0;
76         }
77     }
78
79     psubwinUID = (char*)getOrCreateDefaultSubwin();
80
81     // Create compound.
82     pstCompoundUID = createGraphicObject(__GO_COMPOUND__);
83     /* Sets the parent-child relationship for the Compound */
84     setGraphicObjectRelationship(psubwinUID, pstCompoundUID);
85
86     /** Get Subwin line color */
87     getGraphicObjectProperty(psubwinUID, __GO_LINE_COLOR__, jni_int, (void**)&piForeground);
88
89     for (i = 0; i < n1; ++i)
90     {
91         /*       j = (i==0) ? 0 : 1; */
92         if (*istk(l2 + i) == 0)
93         {
94             /** fil(i) = 0 rectangle i is drawn using the current line style (or color).**/
95             /* color setting is done now */
96
97             Objrect(stk(l1 + (4 * i)), stk(l1 + (4 * i) + 1), stk(l1 + (4 * i) + 2), stk(l1 + (4 * i) + 3),
98                     &foreground, NULL, FALSE, TRUE, &hdl);
99         }
100         else
101         {
102             if (*istk(l2 + i) < 0)
103             {
104                 /** fil(i) < 0 rectangle i is drawn using the line style (or color) **/
105                 int tmp = - (*istk(l2 + i));
106                 Objrect(stk(l1 + (4 * i)), stk(l1 + (4 * i) + 1), stk(l1 + (4 * i) + 2), stk(l1 + (4 * i) + 3),
107                         &tmp, NULL, FALSE, TRUE, &hdl);
108             }
109             else
110             {
111                 /** fil(i) > 0   rectangle i is filled using the pattern (or color) **/
112                 Objrect(stk(l1 + (4 * i)), stk(l1 + (4 * i) + 1), stk(l1 + (4 * i) + 2), stk(l1 + (4 * i) + 3),
113                         NULL, istk(l2 + i), TRUE, FALSE, &hdl);
114             }
115         }
116         // Add newly created object to Compound
117         setGraphicObjectRelationship(pstCompoundUID, getObjectFromHandle(hdl));
118     }
119
120     /** make Compound current object **/
121     setCurrentObject(pstCompoundUID);
122
123     releaseGraphicObjectProperty(-1, pstCompoundUID, jni_string, 0);
124
125     LhsVar(1) = 0;
126     PutLhsVar();
127     return 0;
128 }
129 /*--------------------------------------------------------------------------*/