1 /*
2 * $Id: odraw.c,v 1.3 2002/07/06 08:51:42 isizaka Exp isizaka $
3 *
4 * This file is part of "Ngraph for X11".
5 *
6 * Copyright (C) 2002, Satoshi ISHIZAKA. isizaka@msa.biglobe.ne.jp
7 *
8 * "Ngraph for X11" is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * as published by the Free Software Foundation; either version 2
11 * of the License, or (at your option) any later version.
12 *
13 * "Ngraph for X11" is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 *
22 */
23
24 /**
25 *
26 * $Log: odraw.c,v $
27 * Revision 1.3 2002/07/06 08:51:42 isizaka
28 * change to GPL.
29 *
30 * Revision 1.2 1999/04/15 12:15:27 isizaka
31 * for release 6.03.01
32 *
33 * Revision 1.1 1999/03/17 13:46:09 isizaka
34 * Initial revision
35 *
36 *
37 **/
38
39 #include <stdlib.h>
40 #include <ctype.h>
41 #include <stdio.h>
42 #include <string.h>
43 #include "ngraph.h"
44 #include "object.h"
45 #include "ioutil.h"
46 #include "gra.h"
47 #include "odraw.h"
48 #include "nstring.h"
49
50 #define NAME "draw"
51 #define PARENT "object"
52 #define VERSION "1.00.00"
53 #define TRUE 1
54 #define FALSE 0
55
56 #define ERRILGC 100
57 #define ERRGCOPEN 101
58
59 #define ERRNUM 2
60
61 char *drawerrorlist[ERRNUM]={
62 "illegal graphics context",
63 "grahics context is not opened"
64 };
65
66 char *pathchar[5]={
67 "unchange",
68 "full",
69 "relative",
70 "base",
71 NULL,
72 };
73
74 char *capchar[4]={
75 "butt",
76 "round",
77 "projecting",
78 NULL
79 };
80
81 char *joinchar[4]={
82 "miter",
83 "round",
84 "bevel",
85 NULL
86 };
87
88 char *fontchar[14]={
89 "Times",
90 "TimesBold",
91 "TimesItalic",
92 "TimesBoldItalic",
93 "Helvetica",
94 "HelveticaBold",
95 "HelveticaOblique",
96 "HelveticaBoldOblique",
97 "Courier",
98 "CourierBold",
99 "CourierOblique",
100 "CourierBoldOblique",
101 "Symbol",
102 NULL
103 };
104
105 char *jfontchar[3]={
106 "Mincho",
107 "Gothic",
108 NULL
109 };
110
111 char *arrowchar[5]={
112 "none",
113 "end",
114 "begin",
115 "both",
116 NULL
117 };
118
119 char *intpchar[5]={
120 "spline",
121 "spline_close",
122 "bspline",
123 "bspline_close",
124 NULL
125 };
126
drawinit(struct objlist * obj,char * inst,char * rval,int argc,char ** argv)127 int drawinit(struct objlist *obj,char *inst,char *rval,int argc,char **argv)
128 {
129 int clip,redrawf;
130
131 if (_exeparent(obj,(char *)argv[1],inst,rval,argc,argv)) return 1;
132 clip=TRUE;
133 redrawf=TRUE;
134 if (_putobj(obj,"clip",inst,&clip)) return 1;
135 if (_putobj(obj,"redraw_flag",inst,&redrawf)) return 1;
136 return 0;
137 }
138
drawdone(struct objlist * obj,char * inst,char * rval,int argc,char ** argv)139 int drawdone(struct objlist *obj,char *inst,char *rval,int argc,char **argv)
140 {
141 if (_exeparent(obj,(char *)argv[1],inst,rval,argc,argv)) return 1;
142 return 0;
143 }
144
145
drawdraw(struct objlist * obj,char * inst,char * rval,int argc,char ** argv)146 int drawdraw(struct objlist *obj,char *inst,char *rval,int argc,char **argv)
147 {
148 int GC,hidden;
149
150 GC=*(int *)(argv[2]);
151 if (GRAopened(GC)<0) {
152 error3(obj,ERRGCOPEN,GC);
153 return 1;
154 }
155 _getobj(obj,"hidden",inst,&hidden);
156 if (hidden) GC=-1;
157 if (_putobj(obj,"GC",inst,&GC)) return 1;
158 return 0;
159 }
160
pathsave(struct objlist * obj,char * inst,char * rval,int argc,char ** argv)161 int pathsave(struct objlist *obj,char *inst,char *rval,int argc,char **argv)
162 {
163 struct narray *array,*array2;
164 int anum;
165 char **adata;
166 int i,j;
167 char *argv2[4];
168 char *file,*name,*s,*valstr;
169 int path;
170
171 array=(struct narray *)argv[2];
172 anum=arraynum(array);
173 adata=arraydata(array);
174 for (j=0;j<anum;j++)
175 if (strcmp0("file",adata[j])==0) {
176 if (_exeparent(obj,(char *)argv[1],inst,rval,argc,argv)) return 1;
177 return 0;
178 }
179 array2=arraynew(sizeof(char *));
180 for (i=0;i<anum;i++) arrayadd(array2,&(adata[i]));
181 s="file";
182 arrayadd(array2,&s);
183 argv2[0]=argv[0];
184 argv2[1]=argv[1];
185 argv2[2]=(char *)array2;
186 argv2[3]=NULL;
187 if (_exeparent(obj,(char *)argv[1],inst,rval,3,argv2)) {
188 arrayfree(array2);
189 return 1;
190 }
191 arrayfree(array2);
192 name=NULL;
193 if (_getobj(obj,"save_path",inst,&path)) goto errexit;
194 if (_getobj(obj,"file",inst,&file)) goto errexit;
195 if (file!=NULL) {
196 if (path==1) name=getfullpath(file);
197 else if (path==2) name=getrelativepath(file);
198 else if (path==3) name=getbasename(file);
199 else if (path==0) {
200 if ((name=memalloc(strlen(file)+1))==NULL) goto errexit;
201 strcpy(name,file);
202 }
203 }
204
205 if ((s=nstrnew())==NULL) goto errexit;
206 if ((s=nstrcat(s,*(char **)rval))==NULL) goto errexit;
207 if ((s=nstrccat(s,'\t'))==NULL) goto errexit;
208 if ((s=nstrcat(s,argv[0]))==NULL) goto errexit;
209 if ((s=nstrcat(s,"::file="))==NULL) goto errexit;
210 if ((valstr=getvaluestr(obj,"file",&name,FALSE,TRUE))==NULL) {
211 memfree(s);
212 goto errexit;
213 }
214 if ((s=nstrcat(s,valstr))==NULL) {
215 memfree(valstr);
216 goto errexit;
217 }
218 memfree(valstr);
219 if ((s=nstrccat(s,'\n'))==NULL) goto errexit;
220 memfree(name);
221 memfree(*(char **)rval);
222 *(char **)rval=s;
223 return 0;
224
225 errexit:
226 memfree(name);
227 memfree(*(char **)rval);
228 *(char **)rval=NULL;
229 return 1;
230 }
231
232 #define TBLNUM 11
233
234 struct objtable draw[TBLNUM] = {
235 {"init",NVFUNC,0,drawinit,NULL,0},
236 {"done",NVFUNC,0,drawdone,NULL,0},
237 {"GC",NINT,0,NULL,NULL,0},
238 {"hidden",NBOOL,NREAD|NWRITE,NULL,NULL,0},
239 {"draw",NVFUNC,NREAD|NEXEC,drawdraw,"i",0},
240 {"redraw",NVFUNC,NREAD|NEXEC,drawdraw,"i",0},
241 {"R",NINT,NREAD|NWRITE,NULL,NULL,0},
242 {"G",NINT,NREAD|NWRITE,NULL,NULL,0},
243 {"B",NINT,NREAD|NWRITE,NULL,NULL,0},
244 {"clip",NBOOL,NREAD|NWRITE,NULL,NULL,0},
245 {"redraw_flag",NBOOL,NREAD|NWRITE,NULL,NULL,0},
246 };
247
adddraw()248 void *adddraw()
249 /* adddraw() returns NULL on error */
250 {
251 return addobject(NAME,NULL,PARENT,VERSION,TBLNUM,draw,ERRNUM,drawerrorlist,NULL,NULL);
252 }
253