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