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