170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * jmemmac.c
370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *
470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Copyright (C) 1992-1997, Thomas G. Lane.
570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * This file is part of the Independent JPEG Group's software.
670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * For conditions of distribution and use, see the accompanying README file.
770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *
870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * jmemmac.c provides an Apple Macintosh implementation of the system-
970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * dependent portion of the JPEG memory manager.
1070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *
1170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * If you use jmemmac.c, then you must define USE_MAC_MEMMGR in the
1270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * JPEG_INTERNALS part of jconfig.h.
1370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *
1470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * jmemmac.c uses the Macintosh toolbox routines NewPtr and DisposePtr
1570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * instead of malloc and free.  It accurately determines the amount of
1670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * memory available by using CompactMem.  Notice that if left to its
1770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * own devices, this code can chew up all available space in the
1870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * application's zone, with the exception of the rather small "slop"
1970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * factor computed in jpeg_mem_available().  The application can ensure
2070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * that more space is left over by reducing max_memory_to_use.
2170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *
2270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Large images are swapped to disk using temporary files and System 7.0+'s
2370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * temporary folder functionality.
2470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *
2570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Note that jmemmac.c depends on two features of MacOS that were first
2670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * introduced in System 7: FindFolder and the FSSpec-based calls.
2770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * If your application uses jmemmac.c and is run under System 6 or earlier,
2870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * and the jpeg library decides it needs a temporary file, it will abort,
2970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * printing error messages about requiring System 7.  (If no temporary files
3070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * are created, it will run fine.)
3170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *
3270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * If you want to use jmemmac.c in an application that might be used with
3370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * System 6 or earlier, then you should remove dependencies on FindFolder
3470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * and the FSSpec calls.  You will need to replace FindFolder with some
3570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * other mechanism for finding a place to put temporary files, and you
3670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * should replace the FSSpec calls with their HFS equivalents:
3770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *
3870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *     FSpDelete     ->  HDelete
3970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *     FSpGetFInfo   ->  HGetFInfo
4070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *     FSpCreate     ->  HCreate
4170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *     FSpOpenDF     ->  HOpen      *** Note: not HOpenDF ***
4270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *     FSMakeFSSpec  ->  (fill in spec by hand.)
4370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *
4470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * (Use HOpen instead of HOpenDF.  HOpen is just a glue-interface to PBHOpen,
4570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * which is on all HFS macs.  HOpenDF is a System 7 addition which avoids the
4670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * ages-old problem of names starting with a period.)
4770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *
4870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Contributed by Sam Bushell (jsam@iagu.on.net) and
4970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Dan Gildor (gyld@in-touch.com).
5070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
5170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
5270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define JPEG_INTERNALS
5370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#include "jinclude.h"
5470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#include "jpeglib.h"
5570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#include "jmemsys.h"    /* import the system-dependent declarations */
5670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
5770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifndef USE_MAC_MEMMGR	/* make sure user got configuration right */
5870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  You forgot to define USE_MAC_MEMMGR in jconfig.h. /* deliberate syntax error */
5970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif
6070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
6170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#include <Memory.h>     /* we use the MacOS memory manager */
6270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#include <Files.h>      /* we use the MacOS File stuff */
6370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#include <Folders.h>    /* we use the MacOS HFS stuff */
6470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#include <Script.h>     /* for smSystemScript */
6570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#include <Gestalt.h>    /* we use Gestalt to test for specific functionality */
6670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
6770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifndef TEMP_FILE_NAME		/* can override from jconfig.h or Makefile */
6870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define TEMP_FILE_NAME  "JPG%03d.TMP"
6970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif
7070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
7170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinestatic int next_file_num;	/* to distinguish among several temp files */
7270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
7370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
7470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
7570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Memory allocation and freeing are controlled by the MacOS library
7670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * routines NewPtr() and DisposePtr(), which allocate fixed-address
7770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * storage.  Unfortunately, the IJG library isn't smart enough to cope
7870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * with relocatable storage.
7970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
8070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
8170a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineGLOBAL(void *)
8270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinejpeg_get_small (j_common_ptr cinfo, size_t sizeofobject)
8370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
8470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  return (void *) NewPtr(sizeofobject);
8570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
8670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
8770a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineGLOBAL(void)
8870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinejpeg_free_small (j_common_ptr cinfo, void * object, size_t sizeofobject)
8970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
9070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  DisposePtr((Ptr) object);
9170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
9270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
9370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
9470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
9570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * "Large" objects are treated the same as "small" ones.
9670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * NB: we include FAR keywords in the routine declarations simply for
9770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * consistency with the rest of the IJG code; FAR should expand to empty
9870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * on rational architectures like the Mac.
9970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
10070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
10170a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineGLOBAL(void FAR *)
10270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinejpeg_get_large (j_common_ptr cinfo, size_t sizeofobject)
10370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
10470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  return (void FAR *) NewPtr(sizeofobject);
10570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
10670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
10770a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineGLOBAL(void)
10870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinejpeg_free_large (j_common_ptr cinfo, void FAR * object, size_t sizeofobject)
10970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
11070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  DisposePtr((Ptr) object);
11170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
11270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
11370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
11470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
11570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * This routine computes the total memory space available for allocation.
11670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
11770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
11870a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineGLOBAL(long)
11970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinejpeg_mem_available (j_common_ptr cinfo, long min_bytes_needed,
12070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		    long max_bytes_needed, long already_allocated)
12170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
12270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  long limit = cinfo->mem->max_memory_to_use - already_allocated;
12370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  long slop, mem;
12470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
12570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Don't ask for more than what application has told us we may use */
12670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  if (max_bytes_needed > limit && limit > 0)
12770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    max_bytes_needed = limit;
12870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Find whether there's a big enough free block in the heap.
12970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine   * CompactMem tries to create a contiguous block of the requested size,
13070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine   * and then returns the size of the largest free block (which could be
13170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine   * much more or much less than we asked for).
13270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine   * We add some slop to ensure we don't use up all available memory.
13370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine   */
13470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  slop = max_bytes_needed / 16 + 32768L;
13570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  mem = CompactMem(max_bytes_needed + slop) - slop;
13670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  if (mem < 0)
13770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    mem = 0;			/* sigh, couldn't even get the slop */
13870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Don't take more than the application says we can have */
13970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  if (mem > limit && limit > 0)
14070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    mem = limit;
14170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  return mem;
14270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
14370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
14470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
14570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
14670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Backing store (temporary file) management.
14770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Backing store objects are only used when the value returned by
14870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * jpeg_mem_available is less than the total space needed.  You can dispense
14970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * with these routines if you have plenty of virtual memory; see jmemnobs.c.
15070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
15170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
15270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
15370a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void)
15470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineread_backing_store (j_common_ptr cinfo, backing_store_ptr info,
15570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		    void FAR * buffer_address,
15670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		    long file_offset, long byte_count)
15770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
15870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  long bytes = byte_count;
15970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  long retVal;
16070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
16170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  if ( SetFPos ( info->temp_file, fsFromStart, file_offset ) != noErr )
16270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    ERREXIT(cinfo, JERR_TFILE_SEEK);
16370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
16470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  retVal = FSRead ( info->temp_file, &bytes,
16570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		    (unsigned char *) buffer_address );
16670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  if ( retVal != noErr || bytes != byte_count )
16770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    ERREXIT(cinfo, JERR_TFILE_READ);
16870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
16970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
17070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
17170a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void)
17270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinewrite_backing_store (j_common_ptr cinfo, backing_store_ptr info,
17370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		     void FAR * buffer_address,
17470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		     long file_offset, long byte_count)
17570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
17670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  long bytes = byte_count;
17770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  long retVal;
17870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
17970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  if ( SetFPos ( info->temp_file, fsFromStart, file_offset ) != noErr )
18070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    ERREXIT(cinfo, JERR_TFILE_SEEK);
18170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
18270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  retVal = FSWrite ( info->temp_file, &bytes,
18370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		     (unsigned char *) buffer_address );
18470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  if ( retVal != noErr || bytes != byte_count )
18570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    ERREXIT(cinfo, JERR_TFILE_WRITE);
18670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
18770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
18870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
18970a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void)
19070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineclose_backing_store (j_common_ptr cinfo, backing_store_ptr info)
19170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
19270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  FSClose ( info->temp_file );
19370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  FSpDelete ( &(info->tempSpec) );
19470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
19570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
19670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
19770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
19870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Initial opening of a backing-store object.
19970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *
20070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * This version uses FindFolder to find the Temporary Items folder,
20170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * and puts the temporary file in there.
20270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
20370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
20470a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineGLOBAL(void)
20570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinejpeg_open_backing_store (j_common_ptr cinfo, backing_store_ptr info,
20670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine			 long total_bytes_needed)
20770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
20870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  short         tmpRef, vRefNum;
20970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  long          dirID;
21070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  FInfo         finderInfo;
21170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  FSSpec        theSpec;
21270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  Str255        fName;
21370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  OSErr         osErr;
21470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  long          gestaltResponse = 0;
21570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
21670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Check that FSSpec calls are available. */
21770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  osErr = Gestalt( gestaltFSAttr, &gestaltResponse );
21870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  if ( ( osErr != noErr )
21970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine       || !( gestaltResponse & (1<<gestaltHasFSSpecCalls) ) )
22070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    ERREXITS(cinfo, JERR_TFILE_CREATE, "- System 7.0 or later required");
22170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* TO DO: add a proper error message to jerror.h. */
22270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
22370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Check that FindFolder is available. */
22470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  osErr = Gestalt( gestaltFindFolderAttr, &gestaltResponse );
22570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  if ( ( osErr != noErr )
22670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine       || !( gestaltResponse & (1<<gestaltFindFolderPresent) ) )
22770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    ERREXITS(cinfo, JERR_TFILE_CREATE, "- System 7.0 or later required.");
22870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* TO DO: add a proper error message to jerror.h. */
22970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
23070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  osErr = FindFolder ( kOnSystemDisk, kTemporaryFolderType, kCreateFolder,
23170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine                       &vRefNum, &dirID );
23270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  if ( osErr != noErr )
23370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    ERREXITS(cinfo, JERR_TFILE_CREATE, "- temporary items folder unavailable");
23470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* TO DO: Try putting the temp files somewhere else. */
23570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
23670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Keep generating file names till we find one that's not in use */
23770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  for (;;) {
23870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    next_file_num++;		/* advance counter */
23970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
24070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    sprintf(info->temp_name, TEMP_FILE_NAME, next_file_num);
24170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    strcpy ( (Ptr)fName+1, info->temp_name );
24270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    *fName = strlen (info->temp_name);
24370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    osErr = FSMakeFSSpec ( vRefNum, dirID, fName, &theSpec );
24470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
24570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if ( (osErr = FSpGetFInfo ( &theSpec, &finderInfo ) ) != noErr )
24670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      break;
24770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
24870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
24970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  osErr = FSpCreate ( &theSpec, '????', '????', smSystemScript );
25070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  if ( osErr != noErr )
25170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    ERREXITS(cinfo, JERR_TFILE_CREATE, info->temp_name);
25270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
25370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  osErr = FSpOpenDF ( &theSpec, fsRdWrPerm, &(info->temp_file) );
25470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  if ( osErr != noErr )
25570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    ERREXITS(cinfo, JERR_TFILE_CREATE, info->temp_name);
25670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
25770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  info->tempSpec = theSpec;
25870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
25970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  info->read_backing_store = read_backing_store;
26070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  info->write_backing_store = write_backing_store;
26170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  info->close_backing_store = close_backing_store;
26270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  TRACEMSS(cinfo, 1, JTRC_TFILE_OPEN, info->temp_name);
26370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
26470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
26570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
26670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
26770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * These routines take care of any system-dependent initialization and
26870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * cleanup required.
26970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
27070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
27170a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineGLOBAL(long)
27270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinejpeg_mem_init (j_common_ptr cinfo)
27370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
27470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  next_file_num = 0;
27570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
27670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* max_memory_to_use will be initialized to FreeMem()'s result;
27770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine   * the calling application might later reduce it, for example
27870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine   * to leave room to invoke multiple JPEG objects.
27970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine   * Note that FreeMem returns the total number of free bytes;
28070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine   * it may not be possible to allocate a single block of this size.
28170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine   */
28270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  return FreeMem();
28370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
28470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
28570a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineGLOBAL(void)
28670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinejpeg_mem_term (j_common_ptr cinfo)
28770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
28870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* no work */
28970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
290