Visualization Library 2.0.0-b5

A lightweight C++ OpenGL middleware for 2D/3D graphics

VL     Star     Watch     Fork     Issue

[Download] [Tutorials] [All Classes] [Grouped Classes]
tif_acorn.c
Go to the documentation of this file.
1 /* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tif_acorn.c,v 1.2 2005/12/21 12:23:13 joris Exp $ */
2 
3 /*
4  * Copyright (c) 1988-1997 Sam Leffler
5  * Copyright (c) 1991-1997 Silicon Graphics, Inc.
6  *
7  * Permission to use, copy, modify, distribute, and sell this software and
8  * its documentation for any purpose is hereby granted without fee, provided
9  * that (i) the above copyright notices and this permission notice appear in
10  * all copies of the software and related documentation, and (ii) the names of
11  * Sam Leffler and Silicon Graphics may not be used in any advertising or
12  * publicity relating to the software without the specific, prior written
13  * permission of Sam Leffler and Silicon Graphics.
14  *
15  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
16  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
17  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
18  *
19  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
20  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
21  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
22  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
23  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
24  * OF THIS SOFTWARE.
25  */
26 
27 /*
28  * TIFF Library RISC OS specific Routines.
29  * Developed out of the Unix version.
30  * Peter Greenham, May 1995
31  */
32 #include "tiffiop.h"
33 #include <stdio.h>
34 #include <stdlib.h>
35 
36 /*
37 Low-level file handling
38 ~~~~~~~~~~~~~~~~~~~~~~~
39 The functions in osfcn.h are unavailable when compiling under C, as it's a
40 C++ header. Therefore they have been implemented here.
41 
42 Now, why have I done it this way?
43 
44 The definitive API library for RISC OS is Jonathan Coxhead's OSLib, which
45 uses heavily optimised ARM assembler or even plain inline SWI calls for
46 maximum performance and minimum runtime size. However, I don't want to make
47 LIBTIFF need that to survive. Therefore I have also emulated the functions
48 using macros to _swi() and _swix() defined in the swis.h header, and
49 borrowing types from kernel.h, which is less efficient but doesn't need any
50 third-party libraries.
51  */
52 
53 #ifdef INCLUDE_OSLIB
54 
55 #include "osfile.h"
56 #include "osgbpb.h"
57 #include "osargs.h"
58 #include "osfind.h"
59 
60 #else
61 
62 /* OSLIB EMULATION STARTS */
63 
64 #include "kernel.h"
65 #include "swis.h"
66 
67 /* From oslib:types.h */
68 typedef unsigned int bits;
69 typedef unsigned char byte;
70 #ifndef TRUE
71 #define TRUE 1
72 #endif
73 #ifndef FALSE
74 #define FALSE 0
75 #endif
76 #ifndef NULL
77 #define NULL 0
78 #endif
79 #ifndef SKIP
80 #define SKIP 0
81 #endif
82 
83 /* From oslib:os.h */
84 typedef _kernel_oserror os_error;
85 typedef byte os_f;
86 
87 /* From oslib:osfile.h */
88 #undef OS_File
89 #define OS_File 0x8
90 
91 /* From oslib:osgbpb.h */
92 #undef OS_GBPB
93 #define OS_GBPB 0xC
94 #undef OSGBPB_Write
95 #define OSGBPB_Write 0x2
96 #undef OSGBPB_Read
97 #define OSGBPB_Read 0x4
98 
99 extern os_error *xosgbpb_write (os_f file,
100  byte *data,
101  int size,
102  int *unwritten);
103 extern int osgbpb_write (os_f file,
104  byte *data,
105  int size);
106 
107 #define xosgbpb_write(file, data, size, unwritten) \
108  (os_error*) _swix(OS_GBPB, _IN(0)|_IN(1)|_IN(2)|_IN(3)|_IN(4)|_OUT(3), \
109  OSGBPB_WriteAt, \
110  file, \
111  data, \
112  size, \
113  unwritten)
114 
115 #define osgbpb_write(file, data, size) \
116  _swi(OS_GBPB, _IN(0)|_IN(1)|_IN(2)|_IN(3)|_RETURN(3), \
117  OSGBPB_Write, \
118  file, \
119  data, \
120  size)
121 
122 extern os_error *xosgbpb_read (os_f file,
123  byte *buffer,
124  int size,
125  int *unread);
126 extern int osgbpb_read (os_f file,
127  byte *buffer,
128  int size);
129 
130 #define xosgbpb_read(file, buffer, size, unread) \
131  (os_error*) _swix(OS_GBPB, _IN(0)|_IN(1)|_IN(2)|_IN(3)|_OUT(3), \
132  OSGBPB_Read, \
133  file, \
134  buffer, \
135  size, \
136  unread)
137 
138 #define osgbpb_read(file, buffer, size) \
139  _swi(OS_GBPB, _IN(0)|_IN(1)|_IN(2)|_IN(3)|_RETURN(3), \
140  OSGBPB_Read, \
141  file, \
142  buffer, \
143  size)
144 
145 /* From oslib:osfind.h */
146 #undef OS_Find
147 #define OS_Find 0xD
148 #undef OSFind_Openin
149 #define OSFind_Openin 0x40
150 #undef OSFind_Openout
151 #define OSFind_Openout 0x80
152 #undef OSFind_Openup
153 #define OSFind_Openup 0xC0
154 #undef OSFind_Close
155 #define OSFind_Close 0x0
156 
157 #define xosfind_open(reason, file_name, path, file) \
158  (os_error*) _swix(OS_Find, _IN(0)|_IN(1)|_IN(2)|_OUT(0), \
159  reason, file_name, path, file)
160 
161 #define osfind_open(reason, file_name, path) \
162  (os_f) _swi(OS_Find, _IN(0)|_IN(1)|_IN(2)|_RETURN(0), \
163  reason, file_name, path)
164 
166  char *file_name,
167  char *path,
168  os_f *file);
169 extern os_f osfind_openin (bits flags,
170  char *file_name,
171  char *path);
172 
173 #define xosfind_openin(flags, file_name, path, file) \
174  xosfind_open(flags | OSFind_Openin, file_name, path, file)
175 
176 #define osfind_openin(flags, file_name, path) \
177  osfind_open(flags | OSFind_Openin, file_name, path)
178 
180  char *file_name,
181  char *path,
182  os_f *file);
183 extern os_f osfind_openout (bits flags,
184  char *file_name,
185  char *path);
186 
187 #define xosfind_openout(flags, file_name, path, file) \
188  xosfind_open(flags | OSFind_Openout, file_name, path, file)
189 
190 #define osfind_openout(flags, file_name, path) \
191  osfind_open(flags | OSFind_Openout, file_name, path)
192 
194  char *file_name,
195  char *path,
196  os_f *file);
197 extern os_f osfind_openup (bits flags,
198  char *file_name,
199  char *path);
200 
201 #define xosfind_openup(flags, file_name, path, file) \
202  xosfind_open(flags | OSFind_Openup, file_name, path, file)
203 
204 #define osfind_openup(flags, file_name, path) \
205  osfind_open(flags | OSFind_Openup, file_name, path)
206 
207 extern os_error *xosfind_close (os_f file);
208 extern void osfind_close (os_f file);
209 
210 #define xosfind_close(file) \
211  (os_error*) _swix(OS_Find, _IN(0)|_IN(1), \
212  OSFind_Close, \
213  file)
214 
215 #define osfind_close(file) \
216  (void) _swi(OS_Find, _IN(0)|_IN(1), \
217  OSFind_Close, \
218  file)
219 
220 /* From oslib:osargs.h */
221 #undef OS_Args
222 #define OS_Args 0x9
223 #undef OSArgs_ReadPtr
224 #define OSArgs_ReadPtr 0x0
225 #undef OSArgs_SetPtr
226 #define OSArgs_SetPtr 0x1
227 #undef OSArgs_ReadExt
228 #define OSArgs_ReadExt 0x2
229 
230 extern os_error *xosargs_read_ptr (os_f file,
231  int *ptr);
232 extern int osargs_read_ptr (os_f file);
233 
234 #define xosargs_read_ptr(file, ptr) \
235  (os_error*) _swix(OS_Args, _IN(0)|_IN(1)|_OUT(2), \
236  OSArgs_ReadPtr, \
237  file, \
238  ptr)
239 
240 #define osargs_read_ptr(file) \
241  _swi(OS_Args, _IN(0)|_IN(1)|_RETURN(2), \
242  OSArgs_ReadPtr, \
243  file)
244 
245 extern os_error *xosargs_set_ptr (os_f file,
246  int ptr);
247 extern void osargs_set_ptr (os_f file,
248  int ptr);
249 
250 #define xosargs_set_ptr(file, ptr) \
251  (os_error*) _swix(OS_Args, _IN(0)|_IN(1)|_IN(2), \
252  OSArgs_SetPtr, \
253  file, \
254  ptr)
255 
256 #define osargs_set_ptr(file, ptr) \
257  (void) _swi(OS_Args, _IN(0)|_IN(1)|_IN(2), \
258  OSArgs_SetPtr, \
259  file, \
260  ptr)
261 
262 extern os_error *xosargs_read_ext (os_f file,
263  int *ext);
264 extern int osargs_read_ext (os_f file);
265 
266 #define xosargs_read_ext(file, ext) \
267  (os_error*) _swix(OS_Args, _IN(0)|_IN(1)|_OUT(2), \
268  OSArgs_ReadExt, \
269  file, \
270  ext)
271 
272 #define osargs_read_ext(file) \
273  _swi(OS_Args, _IN(0)|_IN(1)|_RETURN(2), \
274  OSArgs_ReadExt, \
275  file)
276 
277 /* OSLIB EMULATION ENDS */
278 
279 #endif
280 
281 #ifndef __osfcn_h
282 /* Will be set or not during tiffcomp.h */
283 /* You get this to compile under C++? Please say how! */
284 
285 extern int open(const char* name, int flags, int mode)
286 {
287  /* From what I can tell, should return <0 for failure */
288  os_error* e = (os_error*) 1; /* Cheeky way to use a pointer eh? :-) */
289  os_f file = (os_f) -1;
290 
291  flags = flags;
292 
293  switch(mode)
294  {
295  case O_RDONLY:
296  {
297  e = xosfind_openin(SKIP, name, SKIP, &file);
298  break;
299  }
300  case O_WRONLY:
301  case O_RDWR|O_CREAT:
302  case O_RDWR|O_CREAT|O_TRUNC:
303  {
304  e = xosfind_openout(SKIP, name, SKIP, &file);
305  break;
306  }
307  case O_RDWR:
308  {
309  e = xosfind_openup(SKIP, name, SKIP, &file);
310  break;
311  }
312  }
313  if (e)
314  {
315  file = (os_f) -1;
316  }
317  return (file);
318 }
319 
320 extern int close(int fd)
321 {
322  return ((int) xosfind_close((os_f) fd));
323 }
324 
325 extern int write(int fd, const char *buf, int nbytes)
326 {
327  /* Returns number of bytes written */
328  return (nbytes - osgbpb_write((os_f) fd, (const byte*) buf, nbytes));
329 }
330 
331 extern int read(int fd, char *buf, int nbytes)
332 {
333  /* Returns number of bytes read */
334  return (nbytes - osgbpb_read((os_f) fd, (byte*) buf, nbytes));
335 }
336 
337 extern off_t lseek(int fd, off_t offset, int whence)
338 {
339  int absolute = 0;
340 
341  switch (whence)
342  {
343  case SEEK_SET:
344  {
345  absolute = (int) offset;
346  break;
347  }
348  case SEEK_CUR:
349  {
350  absolute = osargs_read_ptr((os_f) fd) + (int) offset;
351  break;
352  }
353  case SEEK_END:
354  {
355  absolute = osargs_read_ext((os_f) fd) + (int) offset;
356  break;
357  }
358  }
359 
360  osargs_set_ptr((os_f) fd, absolute);
361 
362  return ((off_t) osargs_read_ptr((os_f) fd));
363 }
364 #endif
365 
366 static tsize_t
367 _tiffReadProc(thandle_t fd, tdata_t buf, tsize_t size)
368 {
369  return ((tsize_t) read((int) fd, buf, (size_t) size));
370 }
371 
372 static tsize_t
373 _tiffWriteProc(thandle_t fd, tdata_t buf, tsize_t size)
374 {
375  return ((tsize_t) write((int) fd, buf, (size_t) size));
376 }
377 
378 static toff_t
379 _tiffSeekProc(thandle_t fd, toff_t off, int whence)
380 {
381  return ((toff_t) lseek((int) fd, (off_t) off, whence));
382 }
383 
384 static int
385 _tiffCloseProc(thandle_t fd)
386 {
387  return (close((int) fd));
388 }
389 
390 static toff_t
391 _tiffSizeProc(thandle_t fd)
392 {
393  return (lseek((int) fd, SEEK_END, SEEK_SET));
394 }
395 
396 #ifdef HAVE_MMAP
397 #error "I didn't know Acorn had that!"
398 #endif
399 
400 /* !HAVE_MMAP */
401 static int
402 _tiffMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize)
403 {
404  (void) fd; (void) pbase; (void) psize;
405  return (0);
406 }
407 
408 static void
409 _tiffUnmapProc(thandle_t fd, tdata_t base, toff_t size)
410 {
411  (void) fd; (void) base; (void) size;
412 }
413 
414 /*
415  * Open a TIFF file descriptor for read/writing.
416  */
417 TIFF*
418 TIFFFdOpen(int fd, const char* name, const char* mode)
419 {
420  TIFF* tif;
421 
422  tif = TIFFClientOpen(name, mode,
423  (thandle_t) fd,
424  _tiffReadProc, _tiffWriteProc,
425  _tiffSeekProc, _tiffCloseProc, _tiffSizeProc,
426  _tiffMapProc, _tiffUnmapProc);
427  if (tif)
428  {
429  tif->tif_fd = fd;
430  }
431  return (tif);
432 }
433 
434 /*
435  * Open a TIFF file for read/writing.
436  */
437 TIFF*
438 TIFFOpen(const char* name, const char* mode)
439 {
440  static const char module[] = "TIFFOpen";
441  int m, fd;
442 
443  m = _TIFFgetMode(mode, module);
444 
445  if (m == -1)
446  {
447  return ((TIFF*) 0);
448  }
449 
450  fd = open(name, 0, m);
451 
452  if (fd < 0)
453  {
454  TIFFErrorExt(0, module, "%s: Cannot open", name);
455  return ((TIFF *)0);
456  }
457  return (TIFFFdOpen(fd, name, mode));
458 }
459 
460 void*
462 {
463  return (malloc((size_t) s));
464 }
465 
466 void
468 {
469  free(p);
470 }
471 
472 void*
474 {
475  return (realloc(p, (size_t) s));
476 }
477 
478 void
480 {
481  memset(p, v, (size_t) c);
482 }
483 
484 void
486 {
487  memcpy(d, s, (size_t) c);
488 }
489 
490 int
491 _TIFFmemcmp(const tdata_t p1, const tdata_t p2, tsize_t c)
492 {
493  return (memcmp(p1, p2, (size_t) c));
494 }
495 
496 static void
497 acornWarningHandler(const char* module, const char* fmt, va_list ap)
498 {
499  if (module != NULL)
500  {
501  fprintf(stderr, "%s: ", module);
502  }
503  fprintf(stderr, "Warning, ");
504  vfprintf(stderr, fmt, ap);
505  fprintf(stderr, ".\n");
506 }
507 TIFFErrorHandler _TIFFwarningHandler = acornWarningHandler;
508 
509 static void
510 acornErrorHandler(const char* module, const char* fmt, va_list ap)
511 {
512  if (module != NULL)
513  {
514  fprintf(stderr, "%s: ", module);
515  }
516  vfprintf(stderr, fmt, ap);
517  fprintf(stderr, ".\n");
518 }
int32 tsize_t
Definition: tiffio.h:66
void * tdata_t
Definition: tiffio.h:67
os_error * xosfind_close(os_f file)
GLfloat GLfloat p
os_error * xosgbpb_read(os_f file, byte *buffer, int size, int *unread)
int write(int fd, const char *buf, int nbytes)
Definition: tif_acorn.c:325
int read(int fd, char *buf, int nbytes)
Definition: tif_acorn.c:331
#define NULL
Definition: ftobjs.h:61
png_voidp ptr
Definition: png.h:1908
os_error * xosfind_openup(bits flags, char *file_name, char *path, os_f *file)
os_error * xosargs_set_ptr(os_f file, int ptr)
unsigned char byte
Definition: tif_acorn.c:69
char * malloc()
void(* TIFFErrorHandler)(const char *, const char *, va_list)
Definition: tiffio.h:259
#define SEEK_END
Definition: zconf.h:251
os_f osfind_openout(bits flags, char *file_name, char *path)
os_error * xosfind_openout(bits flags, char *file_name, char *path, os_f *file)
os_f osfind_openup(bits flags, char *file_name, char *path)
typedef void(APIENTRY *GLDEBUGPROCARB)(GLenum source
Definition: tiffiop.h:95
int osgbpb_read(os_f file, byte *buffer, int size)
_kernel_oserror os_error
Definition: tif_acorn.c:84
int tif_fd
Definition: tiffiop.h:97
void _TIFFmemcpy(tdata_t d, const tdata_t s, tsize_t c)
Definition: tif_acorn.c:485
GLenum GLuint GLenum GLsizei const GLchar * buf
#define SEEK_CUR
Definition: zconf.h:250
int _TIFFmemcmp(const tdata_t p1, const tdata_t p2, tsize_t c)
Definition: tif_acorn.c:491
TIFF * TIFFFdOpen(int fd, const char *name, const char *mode)
Definition: tif_acorn.c:418
void osargs_set_ptr(os_f file, int ptr)
TIFF * TIFFClientOpen(const char *name, const char *mode, thandle_t clientdata, TIFFReadWriteProc readproc, TIFFReadWriteProc writeproc, TIFFSeekProc seekproc, TIFFCloseProc closeproc, TIFFSizeProc sizeproc, TIFFMapFileProc mapproc, TIFFUnmapFileProc unmapproc)
Definition: tif_open.c:141
off_t lseek(int fd, off_t offset, int whence)
Definition: tif_acorn.c:337
GLsizei const GLchar ** path
GLenum mode
const GLdouble * v
GLsizei GLsizei GLenum GLenum const GLvoid * data
GLbitfield flags
unsigned int bits
Definition: tif_acorn.c:68
int close(int fd)
Definition: tif_acorn.c:320
byte os_f
Definition: tif_acorn.c:85
GLuint buffer
const GLubyte * c
int free()
void * _TIFFrealloc(tdata_t p, tsize_t s)
Definition: tif_acorn.c:473
os_f osfind_openin(bits flags, char *file_name, char *path)
void TIFFErrorExt(thandle_t fd, const char *module, const char *fmt,...)
Definition: tif_error.c:63
GLintptr offset
const GLfloat * m
os_error * xosargs_read_ext(os_f file, int *ext)
int osargs_read_ptr(os_f file)
TIFFErrorHandler _TIFFwarningHandler
Definition: tif_acorn.c:507
void _TIFFmemset(tdata_t p, int v, tsize_t c)
Definition: tif_acorn.c:479
GLuint const GLchar * name
void osfind_close(os_f file)
typedef int
Definition: png.h:978
os_error * xosgbpb_write(os_f file, byte *data, int size, int *unwritten)
int osgbpb_write(os_f file, byte *data, int size)
TIFF * TIFFOpen(const char *name, const char *mode)
Definition: tif_acorn.c:438
TIFFErrorHandler _TIFFerrorHandler
Definition: tif_acorn.c:519
int open(const char *name, int flags, int mode)
Definition: tif_acorn.c:285
int _TIFFgetMode(const char *mode, const char *module)
Definition: tif_open.c:117
uint32 toff_t
Definition: tiffio.h:68
os_error * xosargs_read_ptr(os_f file, int *ptr)
os_error * xosfind_openin(bits flags, char *file_name, char *path, os_f *file)
GLdouble s
void * _TIFFmalloc(tsize_t s)
Definition: tif_acorn.c:461
GLenum GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * bits
void _TIFFfree(tdata_t p)
Definition: tif_acorn.c:467
GLsizeiptr size
int osargs_read_ext(os_f file)
void * thandle_t
Definition: tiffio.h:96
#define SEEK_SET
Definition: zconf.h:249