1 /* $XConsortium: objects.h,v 1.6 92/03/20 14:35:56 keith Exp $ */
2 /* Copyright International Business Machines, Corp. 1991
3  * All Rights Reserved
4  * Copyright Lexmark International, Inc. 1991
5  * All Rights Reserved
6  *
7  * License to use, copy, modify, and distribute this software and its
8  * documentation for any purpose and without fee is hereby granted,
9  * provided that the above copyright notice appear in all copies and that
10  * both that copyright notice and this permission notice appear in
11  * supporting documentation, and that the name of IBM or Lexmark not be
12  * used in advertising or publicity pertaining to distribution of the
13  * software without specific, written prior permission.
14  *
15  * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF
16  * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY
17  * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
18  * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.  THE ENTIRE RISK AS TO THE
19  * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT
20  * OR MAINTAIN, BELONGS TO THE LICENSEE.  SHOULD ANY PORTION OF THE
21  * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE
22  * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION.  IN NO EVENT SHALL
23  * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
24  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
25  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
26  * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
27  * THIS SOFTWARE.
28  */
29 /*SHARED*/
30 
31 /*END SHARED*/
32 /*SHARED*/
33 
34 #ifdef WIN32
35 #include <stdio.h>
36 #include <stdlib.h>
37 #include <kpathsea/kpathsea.h>
38 #endif
39 
40 #include "types.h"
41 
42 #define   Permanent(obj)    t1_Permanent(obj)
43 #define   Destroy(obj)      t1_Destroy(obj)
44 #define   Dup(obj)          t1_Dup(obj)
45 #define   InitImager        t1_InitImager
46 #define   TermImager        t1_TermImager
47 #define   ErrorMsg          t1_ErrorMsg
48 
49 struct xobject *t1_Permanent(void *);  /* make an object permanent            */
50 struct xobject *t1_Destroy(void *);    /* destroy an object                   */
51 struct xobject *t1_Dup(struct xobject *);    /* duplicate an object           */
52 void t1_InitImager(void);     /* initialize TYPE1IMAGER                       */
53 void t1_TermImager(void);     /* terminate TYPE1IMAGER                        */
54 const char *t1_ErrorMsg(void);     /* return last TYPE1IMAGER error message   */
55 
56 /*END SHARED*/
57 /*SHARED*/
58 
59 #define   Allocate(n,t,s)   t1_Allocate(n,t,s)
60 #define   Free(obj)         t1_Free(obj)
61 #define   NonObjectFree(a)  Xfree(a)
62 #define   Consume           t1_Consume
63 #define   ArgErr(s,o,r)     t1_ArgErr(s,o,r)
64 #define   TypeErr(n,o,e,r)  t1_TypeErr(n,o,e,r)
65 #define   Copy(obj)         t1_Copy(obj)
66 #define   Unique(obj)       t1_Unique(obj)
67 
68 void t1_abort(const char *);  /* crash; software logic error                  */
69 struct xobject *t1_Allocate(int, void *, int);    /* allocate memory          */
70 void t1_Free(void *);         /* free memory                                  */
71 struct xobject *t1_Unique(struct xobject *);
72                               /* make a unique temporary copy of an object    */
73 struct xobject *t1_ArgErr(const char *, void *, void *);
74                               /* handle argument errors                       */
75 struct xobject *t1_TypeErr(const char *, void *, int, void *);
76                               /* handle 'bad type' argument errors            */
77 void t1_Consume(int, ...);    /* consume a variable number of arguments       */
78 struct xobject *t1_Copy(struct xobject *);
79                               /* make a new copy, not reference bump PNM      */
80 
81 /*END SHARED*/
82 /*SHARED*/
83 
84 #define   ON          (~0)   /* all bits on                                  */
85 #ifndef FALSE
86 #define   FALSE       0      /* handy zero value                             */
87 #endif
88 #ifndef TRUE
89 #define   TRUE        1      /* handy non-zero value                         */
90 #endif
91 
92 #ifndef   NULL
93 #define   NULL        0
94 /*
95 The NULL pointer is system specific.  (Most systems, however, use 0.)
96 TYPE1IMAGER could have its own NULL, independent of the rest of the system,
97 were it not for malloc().  The system call malloc() returns NULL when
98 out of memory.
99 :i1/portibility assumptions/
100 */
101 #endif
102 
103 #ifdef MAX
104 #undef MAX
105 #endif
106 
107 #ifdef MIN
108 #undef MIN
109 #endif
110 
111 #ifdef ABS
112 #undef ABS
113 #endif
114 
115 #define   MIN(a,b)    (((a)<(b)) ? a : b)
116 #define   MAX(a,b)    (((a)>(b)) ? a : b)
117 #define   ABS(a)      (((a)>=0)?(a):-(a))
118 
119 /*END SHARED*/
120 /*SHARED*/
121 
122 struct xobject {
123        char type;           /* encoded type of object                         */
124        unsigned char flag;  /* flag byte for temporary object characteristics */
125        short references;    /* count of pointers to this object
126                                (plus 1 for permanent objects) PNM             */
127 } ;
128 
129 /*END SHARED*/
130 /*SHARED*/
131 
132 #define XOBJ_COMMON      char type; unsigned char flag; short references;
133 
134 /*END SHARED*/
135 /*SHARED*/
136 
137 
138 #define   INVALIDTYPE    0
139 #define   FONTTYPE       1
140 #define   REGIONTYPE     3
141 #define   PICTURETYPE    4
142 #define   SPACETYPE      5
143 #define   LINESTYLETYPE  6
144 #define   EDGETYPE       7
145 #define   STROKEPATHTYPE 8
146 #define   CLUTTYPE       9
147 
148 #define   ISPATHTYPE(type)    ((type)&0x10)  /* all path segments have this bit on */
149 #define   LINETYPE    (0+ISPATHTYPE(ON))
150 #define   CONICTYPE   (1+ISPATHTYPE(ON))
151 #define   BEZIERTYPE  (2+ISPATHTYPE(ON))
152 #define   HINTTYPE    (3+ISPATHTYPE(ON))
153 
154 #define   MOVETYPE    (5+ISPATHTYPE(ON))
155 #define   TEXTTYPE    (6+ISPATHTYPE(ON))
156 
157 /*END SHARED*/
158 /*SHARED*/
159 
160 #define   ISPERMANENT(flag)   ((flag)&0x01)
161 #define   ISIMMORTAL(flag)    ((flag)&0x02)
162 
163 /*END SHARED*/
164 /*SHARED*/
165 
166 #define   PRESERVE(obj)   if (!ISPERMANENT((obj)->flag)) \
167    (obj)->references++;
168 
169 /*END SHARED*/
170 /*SHARED*/
171 
172 #define  INT32COPY(dest,source,bytes) { \
173     register int32_t *p1 = (int32_t *)dest;  register int32_t *p2 = (int32_t *)source; \
174     register int count = (bytes) / sizeof(int32_t); \
175     while (--count >= 0) *p1++ = *p2++; }
176 
177 
178 /*END SHARED*/
179 /*SHARED*/
180 
181 #define   FOLLOWING(p)  ((p)+1)
182 
183 /*END SHARED*/
184 /*SHARED*/
185 
186 #define  TYPECHECK(name, obj, expect, whenBAD, consumables, rettype) { \
187     if (obj->type != expect) { \
188          (Consume)consumables; \
189          return((rettype)TypeErr(name, obj, expect, whenBAD)); \
190     } \
191 }
192 
193 /*END SHARED*/
194 /*SHARED*/
195 
196 #define  ARGCHECK(test,msg,obj,whenBAD,consumables,rettype) { \
197     if (test) { \
198         (Consume)consumables; \
199         return((rettype)ArgErr(msg, obj, whenBAD)); \
200     } \
201 }
202 
203 /*END SHARED*/
204 /*SHARED*/
205 
206 /* Changed use of Dup() below to Temporary(Copy()) because Dup() does not
207    necessarily return a Unique Copy anymore! 3-26-91 */
208 #define  TYPENULLCHECK(name, obj, expect, whenBAD, consumables,rettype) \
209     if (obj == NULL) { \
210         (Consume)consumables; \
211         if (whenBAD != NULL && ISPERMANENT(whenBAD->flag)) \
212               return((rettype)Temporary(Copy(whenBAD))); \
213         else  return((rettype)whenBAD); \
214     } else { \
215         if (obj->type != expect) { \
216              (Consume)consumables; \
217              return((rettype)TypeErr(name, obj, expect, whenBAD)); \
218         } \
219     }
220 /*END SHARED*/
221 /*SHARED*/
222 
223 #define  MAKECONSUME(obj,stmt)  { if (!ISPERMANENT(obj->flag)) stmt; }
224 
225 /*END SHARED*/
226 /*SHARED*/
227 
228 #define MAKEUNIQUE(obj,stmt) ( ( (obj)->references > 1 ) ? stmt : obj )
229 
230 /*END SHARED*/
231 /*SHARED*/
232 /* NDW: personally, I want to see status and error messages! */
233 #define IfTrace0(condition,model)                                 \
234         {if (condition) printf(model);}
235 #define IfTrace1(condition,model,arg0)                            \
236         {if (condition) printf(model,arg0);}
237 #define IfTrace2(condition,model,arg0,arg1)                       \
238         {if (condition) printf(model,arg0,arg1);}
239 #define IfTrace3(condition,model,arg0,arg1,arg2)                  \
240         {if (condition) printf(model,arg0,arg1,arg2);}
241 #define IfTrace4(condition,model,arg0,arg1,arg2,arg3)             \
242         {if (condition) printf(model,arg0,arg1,arg2,arg3);}
243 #define IfTrace5(condition,model,arg0,arg1,arg2,arg3,arg4)        \
244         {if (condition) printf(model,arg0,arg1,arg2,arg3,arg4);}
245 #define IfTrace6(condition,model,arg0,arg1,arg2,arg3,arg4,arg5)   \
246         {if (condition) printf(model,arg0,arg1,arg2,arg3,arg4,arg5);}
247 /* NDW: patch ends */
248 
249 void Trace0();
250 char *Trace1(),*Trace2(),*Trace3(),*Trace4(),*Trace5(),*Trace6();
251 
252 #ifdef GLOBALS
253 
254 #define   extern
255 #define   INITIALIZED(value)      = value
256 
257 #else
258 
259 #define   INITIALIZED(value)
260 
261 #endif
262 
263 extern char MustCheckArgs  INITIALIZED(TRUE);
264 extern char MustTraceCalls INITIALIZED(FALSE);
265 extern char MustCrash      INITIALIZED(TRUE);
266 extern char InternalTrace  INITIALIZED(TRUE);
267 extern char LineIOTrace    INITIALIZED(TRUE);
268 
269 extern char ProcessHints   INITIALIZED(TRUE);
270 
271 extern char SaveFontPaths  INITIALIZED(TRUE);
272 
273 extern short CRASTERCompressionType   INITIALIZED(1);
274 
275 extern char ConicDebug     INITIALIZED(0);
276 extern char LineDebug      INITIALIZED(0);
277 extern char RegionDebug    INITIALIZED(0);
278 extern char PathDebug      INITIALIZED(0);
279 extern char FontDebug      INITIALIZED(0);
280 extern char SpaceDebug     INITIALIZED(0);
281 extern char StrokeDebug    INITIALIZED(0);
282 extern char MemoryDebug    INITIALIZED(0);
283 extern char HintDebug      INITIALIZED(0);
284 extern char ImageDebug     INITIALIZED(0);
285 extern char OffPageDebug   INITIALIZED(0);
286 
287 extern short CachedChars   INITIALIZED(0x7FFF);
288 extern short CachedFonts   INITIALIZED(0x7FFF);
289 extern int   CacheBLimit   INITIALIZED(12500);
290 extern char  Continuity    INITIALIZED(2);
291 
292 #ifdef extern
293 #undef extern
294 #endif
295 
296 extern void Xfree(void*);
297 
298 /*END SHARED*/
299