e52ee412e3da5212c41147d84600b7f92fb7a4bf
[scilab.git] / scilab / modules / graphic_export / src / c / xs2file.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2006 - INRIA - Fabrice Leray
4  * Copyright (C) 2006 - INRIA - Jean-Baptiste Silvy
5  * Copyright (C) 2009 - DIGITEO - Allan CORNET
6  * desc : interface for xs2file routine
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 #include <string.h>
17 #include <stdio.h>
18 #include <stdlib.h>
19
20 #include "xs2file.h"
21 #include "stack-c.h"
22 #include "GetProperty.h"
23 #include "IsAScalar.h"
24 #include "localization.h"
25 #include "SetJavaProperty.h"
26 #include "Scierror.h"
27 #include "expandPathVariable.h"
28 #include "PATH_MAX.h"
29 #include "MALLOC.h"
30 #include "FigureList.h"
31 #include "freeArrayOfString.h"
32 #include "../../../graphics/src/c/getHandleProperty/getPropertyAssignedValue.h"
33 /*--------------------------------------------------------------------------*/
34 static BOOL isVectorialExport(ExportFileType fileType);
35 /*--------------------------------------------------------------------------*/
36 int xs2file(char * fname, ExportFileType fileType )
37 {
38     /* Check input and output sizes */
39     CheckLhs(0,1);
40     if (isVectorialExport(fileType) || fileType == JPG_EXPORT)
41     {
42         CheckRhs(2,3);
43     }
44     else
45     {
46         CheckRhs(2,2);
47     }
48
49     if (GetType(1) != sci_matrix && GetType(1) != sci_handles)
50     {
51         Scierror(999,_("%s: Wrong type for input argument #%d: An integer or a handle expected.\n"),fname, 1);
52         LhsVar(1) = 0;
53         PutLhsVar();
54         return 0;
55     }
56
57     if ( (GetType(2) == sci_strings) )
58     {
59         char **fileName = NULL;
60         char *real_filename = NULL;
61         float jpegCompressionQuality = 0.95f;
62         ExportOrientation orientation = EXPORT_PORTRAIT; /* default orientation */
63         int m1 = 0, n1 = 0, l1 = 0;
64         int figurenum = -1;
65         char* figureUID = NULL;
66         char *status = NULL;
67
68         /* get handle by figure number */
69         if(GetType(1) == sci_matrix)
70         {
71             GetRhsVar(1,MATRIX_OF_INTEGER_DATATYPE,&m1,&n1,&l1);
72             if(m1*n1 != 1)
73             {
74                 Scierror(999,_("%s: Wrong size for input argument #%d: A scalar expected.\n"),fname, 1);
75                 return 0;
76             }
77
78             figurenum = *istk(l1);
79             if (!sciIsExistingFigure(figurenum))
80             {
81                 Scierror(999, "%s: Input argument #%d must be a valid figure_id.\n",fname, 1);
82                 return 0;
83             }
84             figureUID = getFigureFromIndex(figurenum);
85         }
86         /* check given handle */
87         if(GetType(1) == sci_handles)
88         {
89             GetRhsVar(1,GRAPHICAL_HANDLE_DATATYPE,&m1,&n1,&l1);
90             if(m1*n1 != 1)
91             {
92                 Scierror(999,_("%s: Wrong size for input argument #%d: A graphic handle expected.\n"),fname, 1);
93                 return 0;
94             }
95             figureUID = getObjectFromHandle(getHandleFromStack(l1));
96
97             if(figureUID == NULL)
98             {
99                 Scierror(999, "%s: Input argument #%d must be a valid handle.\n",fname, 1);
100                 return 0;
101             }
102         }
103
104         /* get file name */
105         GetRhsVar(2,MATRIX_OF_STRING_DATATYPE,&m1,&n1,&fileName);
106         if (m1*n1 == 1)
107         {
108             if (Rhs == 3)
109             {
110                 int nbCol = 0;
111                 int nbRow = 0;
112
113                 if (isVectorialExport(fileType))
114                 {
115
116                     char **sciOrientation = NULL;
117
118                     if (GetType(3) != sci_strings)
119                     {
120                         freeArrayOfString(fileName,m1*n1);
121                         Scierror(999,_("%s: Wrong type for input argument #%d: Single character string expected.\n"),fname, 3);
122                         return 0;
123                     }
124
125                     GetRhsVar(3,MATRIX_OF_STRING_DATATYPE,&nbRow,&nbCol,&sciOrientation);
126                     if (nbRow*nbCol == 1)
127                     {
128                         /* Value should be 'landscape' or 'portrait' but check only the first character */
129                         /* for compatibility with Scilab 4*/
130                         if (strcmp(sciOrientation[0], "landscape") == 0 || strcmp(sciOrientation[0], "l") == 0)
131                         {
132                             freeArrayOfString(sciOrientation,nbRow*nbCol);
133                             orientation = EXPORT_LANDSCAPE;
134                         }
135                         else if(strcmp(sciOrientation[0], "portrait") == 0 || strcmp(sciOrientation[0], "p") == 0)
136                         {
137                             freeArrayOfString(sciOrientation,nbRow*nbCol);
138                             orientation = EXPORT_PORTRAIT;
139                         }
140                         else
141                         {
142                             freeArrayOfString(fileName,m1*n1);
143                             freeArrayOfString(sciOrientation,nbRow*nbCol);
144                             Scierror(999,_("%s: Wrong value for input argument #%d: '%s' or '%s' expected.\n"),fname, 3, "portrait", "landscape");
145                             return 0;
146                         }
147                     }
148                     else
149                     {
150                         freeArrayOfString(fileName,m1*n1);
151                         freeArrayOfString(sciOrientation,nbRow*nbCol);
152                         Scierror(999,_("%s: Wrong size for input argument #%d: Single character string expected.\n"),fname, 3);
153                         return 0;
154                     }
155                 }
156                 else
157                 {
158                     int quality = 0;
159                     GetRhsVar(3, MATRIX_OF_DOUBLE_DATATYPE, &nbRow, &nbCol, &quality);
160                     if (nbRow != 1 || nbCol != 1 || *stk(quality) < 0 || *stk(quality) > 1)
161                     {
162                         freeArrayOfString(fileName, m1 * n1);
163                         Scierror(999,_("%s: Wrong type for input argument #%d: A real between 0 and 1 expected.\n"),fname, 3);
164                         return 0;
165                     }
166                     jpegCompressionQuality = (float) *stk(quality);
167                 }
168             }
169
170             /* Replaces SCI, ~, HOME, TMPDIR by the real path */
171             real_filename = expandPathVariable(fileName[0]);
172
173             /* Call the function for exporting file */
174             status = exportToFile(figureUID, real_filename, fileType, jpegCompressionQuality, orientation);
175
176             /* free pointers no more used */
177             if (real_filename)
178             {
179                 FREE(real_filename);
180                 real_filename = NULL;
181             }
182             freeArrayOfString(fileName,m1*n1);
183
184             /* treat errors */
185             if (strlen(status) != 0)
186             {
187                 Scierror(999,_("%s: %s\n"), fname, status);
188                 return 0;
189             }
190         }
191         else
192         {
193             freeArrayOfString(fileName,m1*n1);
194             Scierror(999,_("%s: Wrong size for input argument #%d: Single character string expected.\n"),fname, 2);
195             return 0;
196         }
197     }
198     else
199     {
200         Scierror(999,_("%s: Wrong type for input argument #%d: Single character string expected.\n"),fname, 2);
201         return 0;
202     }
203
204     LhsVar(1) = 0;
205     PutLhsVar();
206
207     return 0;
208 }
209 /*--------------------------------------------------------------------------*/
210 static BOOL isVectorialExport(ExportFileType fileType)
211 {
212     return fileType == EPS_EXPORT
213         || fileType == PS_EXPORT
214         || fileType == PDF_EXPORT
215         || fileType == SVG_EXPORT;
216 }
217 /*--------------------------------------------------------------------------*/