/* $Header$ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * modifed for use with OS/2 by David Webster * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library OS/2-specific Routines. Adapted from tif_win32.c 2/16/00 by * David Webster (dwebster@bhmi.com), Baldwin, Hackett, and Meeks, Inc., Omaha, NE USA */ #define INCL_PM #define INCL_BASE #include #include #include #include "tiffiop.h" /* Some windows datatypes */ typedef ULONG DWORD; typedef ULONG HANDLE; typedef PCHAR LPTSTR; typedef const PCHAR LPCTSTR; typedef CHAR TCHAR; #define GlobalAlloc(a,b) malloc(b) #define LocalAlloc(a,b) malloc(b) #define GlobalFree(b) free(b) #define LocalFree(b) free(b) #define GlobalReAlloc(p, s, t) realloc(p, s) #define CopyMemory(p, v, s) memcpy(p, v, s) #define FillMemory(p, c, s) memset(p, c, s) #define GlobalSize(p) sizeof(p) #define wsprintf sprintf #define wvsprintf vsprintf #define lstrlen strlen static tsize_t LINKAGEMODE _tiffReadProc(thandle_t fd, tdata_t buf, tsize_t size) { DWORD dwSizeRead; if (!DosRead((HFILE)fd, buf, size, &dwSizeRead)) return(0); return ((tsize_t) dwSizeRead); } static tsize_t LINKAGEMODE _tiffWriteProc(thandle_t fd, tdata_t buf, tsize_t size) { DWORD dwSizeWritten; if (!DosWrite((HFILE)fd, buf, size, &dwSizeWritten)) return(0); return ((tsize_t) dwSizeWritten); } static toff_t LINKAGEMODE _tiffSeekProc(thandle_t fd, toff_t off, int whence) { DWORD dwMoveMethod; ULONG ibActual; switch(whence) { case 0: dwMoveMethod = FILE_BEGIN; break; case 1: dwMoveMethod = FILE_CURRENT; break; case 2: dwMoveMethod = FILE_END; break; default: dwMoveMethod = FILE_BEGIN; break; } DosSetFilePtr((HFILE)fd, off, dwMoveMethod, &ibActual); return((toff_t)ibActual); } static int LINKAGEMODE _tiffCloseProc(thandle_t fd) { return (DosClose((HFILE)fd) ? 0 : -1); } static toff_t LINKAGEMODE _tiffSizeProc(thandle_t fd) { FILESTATUS3 vStatus; DosQueryFileInfo((HFILE)fd, FIL_STANDARD, &vStatus, sizeof(FILESTATUS3)); return (vStatus.cbFile); } static int LINKAGEMODE _tiffDummyMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize) { return (0); } /* * From "Hermann Josef Hill" : * * Windows uses both a handle and a pointer for file mapping, * but according to the SDK documentation and Richter's book * "Advanced Windows Programming" it is safe to free the handle * after obtaining the file mapping pointer * * This removes a nasty OS dependency and cures a problem * with Visual C++ 5.0 */ static int LINKAGEMODE _tiffMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize) { return(0); } static void LINKAGEMODE _tiffDummyUnmapProc(thandle_t fd, tdata_t base, toff_t size) { } static void LINKAGEMODE _tiffUnmapProc(thandle_t fd, tdata_t base, toff_t size) { } /* * Open a TIFF file descriptor for read/writing. * Note that TIFFFdOpen and TIFFOpen recognise the character 'u' in the mode * string, which forces the file to be opened unmapped. */ TIFF* TIFFFdOpen(int ifd, const char* name, const char* mode) { TIFF* tif; BOOL fSuppressMap = (mode[1] == 'u' || mode[2] == 'u'); tif = TIFFClientOpen(name, mode, (thandle_t)ifd, _tiffReadProc, _tiffWriteProc, _tiffSeekProc, _tiffCloseProc, _tiffSizeProc, fSuppressMap ? _tiffDummyMapProc : _tiffMapProc, fSuppressMap ? _tiffDummyUnmapProc : _tiffUnmapProc); if (tif) tif->tif_fd = ifd; return (tif); } /* * Open a TIFF file for read/writing. */ TIFF* TIFFOpen(const char* name, const char* mode) { static const char module[] = "TIFFOpen"; thandle_t fd; int m; DWORD dwOpenMode; DWORD dwOpenFlags; DWORD dwAction; APIRET ulrc; m = _TIFFgetMode(mode, module); switch(m) { case O_RDONLY: dwOpenMode = OPEN_ACCESS_READONLY; dwOpenFlags = OPEN_ACTION_FAIL_IF_NEW; break; case O_RDWR: dwOpenMode = OPEN_ACCESS_READWRITE; dwOpenFlags = OPEN_ACTION_FAIL_IF_NEW; break; case O_RDWR|O_CREAT: dwOpenMode = OPEN_ACCESS_READWRITE; dwOpenFlags = OPEN_ACTION_CREATE_IF_NEW; break; case O_RDWR|O_TRUNC: dwOpenMode = OPEN_ACCESS_READWRITE; dwOpenFlags = OPEN_ACTION_FAIL_IF_NEW | OPEN_ACTION_OPEN_IF_EXISTS; break; case O_RDWR|O_CREAT|O_TRUNC: dwOpenMode = OPEN_ACCESS_READWRITE; dwOpenFlags = OPEN_ACTION_CREATE_IF_NEW | OPEN_ACTION_REPLACE_IF_EXISTS; break; default: return ((TIFF*)0); } ulrc = DosOpen( name, (HFILE*)&fd, &dwAction, FILE_ARCHIVED|FILE_NORMAL ,1000L, dwOpenFlags, dwOpenMode, NULL ); if (fd != NO_ERROR) { TIFFError(module, "%s: Cannot open", name); return ((TIFF *)0); } return (TIFFFdOpen((int)fd, name, mode)); } tdata_t _TIFFmalloc(tsize_t s) { return ((tdata_t)GlobalAlloc(GMEM_FIXED, s)); } void _TIFFfree(tdata_t p) { GlobalFree(p); return; } tdata_t _TIFFrealloc(tdata_t p, tsize_t s) { void* pvTmp; if ((pvTmp = GlobalReAlloc(p, s, 0)) == NULL) { if ((pvTmp = GlobalAlloc(sGMEM_FIXED, s)) != NULL) { CopyMemory(pvTmp, p, GlobalSize(p)); GlobalFree(p); } } return ((tdata_t)pvTmp); } void _TIFFmemset(void* p, int v, tsize_t c) { FillMemory(p, c, (BYTE)v); } void _TIFFmemcpy(void* d, const tdata_t s, tsize_t c) { CopyMemory(d, s, c); } int _TIFFmemcmp(const tdata_t p1, const tdata_t p2, tsize_t c) { register const *pb1 = (const int*)p1; register const *pb2 = (const int*)p2; register DWORD dwTmp = c; register int iTmp; for (iTmp = 0; dwTmp-- && !iTmp; iTmp = (int)*pb1++ - (int)*pb2++) ; return (iTmp); } static void LINKAGEMODE Os2WarningHandler(const char* module, const char* fmt, va_list ap) { #ifndef TIF_PLATFORM_CONSOLE LPTSTR szTitle; LPTSTR szTmp; LPCTSTR szTitleText = "%s Warning"; LPCTSTR szDefaultModule = "TIFFLIB"; szTmp = (module == NULL) ? (LPTSTR)szDefaultModule : (LPTSTR)module; if ((szTitle = (LPTSTR)LocalAlloc(LMEM_FIXED, (lstrlen(szTmp) + lstrlen(szTitleText) + lstrlen(fmt) + 128)*sizeof(TCHAR))) == NULL) return; wsprintf(szTitle, szTitleText, szTmp); szTmp = szTitle + (lstrlen(szTitle)+2)*sizeof(TCHAR); wvsprintf(szTmp, fmt, ap); WinMessageBox( HWND_DESKTOP ,WinQueryFocus(HWND_DESKTOP) ,szTmp ,szTitle ,0 ,MB_OK | MB_INFORMATION ); LocalFree(szTitle); return; #else if (module != NULL) fprintf(stderr, "%s: ", module); fprintf(stderr, "Warning, "); vfprintf(stderr, fmt, ap); fprintf(stderr, ".\n"); #endif } TIFFErrorHandler _TIFFwarningHandler = Os2WarningHandler; static void LINKAGEMODE Os2ErrorHandler(const char* module, const char* fmt, va_list ap) { #ifndef TIF_PLATFORM_CONSOLE LPTSTR szTitle; LPTSTR szTmp; LPCTSTR szTitleText = "%s Error"; LPCTSTR szDefaultModule = "TIFFLIB"; szTmp = (module == NULL) ? (LPTSTR)szDefaultModule : (LPTSTR)module; if ((szTitle = (LPTSTR)LocalAlloc(LMEM_FIXED, (lstrlen(szTmp) + lstrlen(szTitleText) + lstrlen(fmt) + 128)*sizeof(TCHAR))) == NULL) return; wsprintf(szTitle, szTitleText, szTmp); szTmp = szTitle + (lstrlen(szTitle)+2)*sizeof(TCHAR); wvsprintf(szTmp, fmt, ap); WinMessageBox( HWND_DESKTOP ,WinQueryFocus(HWND_DESKTOP) ,szTmp ,szTitle ,0 ,MB_OK | MB_ICONEXCLAMATION ); LocalFree(szTitle); return; #else if (module != NULL) fprintf(stderr, "%s: ", module); vfprintf(stderr, fmt, ap); fprintf(stderr, ".\n"); #endif } TIFFErrorHandler _TIFFerrorHandler = Os2ErrorHandler;