19f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 29f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * jmemdos.c 39f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 49f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Copyright (C) 1992-1997, Thomas G. Lane. 59f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This file is part of the Independent JPEG Group's software. 69f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * For conditions of distribution and use, see the accompanying README file. 79f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 89f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This file provides an MS-DOS-compatible implementation of the system- 99f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * dependent portion of the JPEG memory manager. Temporary data can be 109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * stored in extended or expanded memory as well as in regular DOS files. 119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * If you use this file, you must be sure that NEED_FAR_POINTERS is defined 139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * if you compile in a small-data memory model; it should NOT be defined if 149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * you use a large-data memory model. This file is not recommended if you 159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * are using a flat-memory-space 386 environment such as DJGCC or Watcom C. 169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Also, this code will NOT work if struct fields are aligned on greater than 179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 2-byte boundaries. 189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Based on code contributed by Ge' Weijers. 209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * If you have both extended and expanded memory, you may want to change the 249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * order in which they are tried in jopen_backing_store. On a 286 machine 259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * expanded memory is usually faster, since extended memory access involves 269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * an expensive protected-mode-and-back switch. On 386 and better, extended 279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * memory is usually faster. As distributed, the code tries extended memory 289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * first (what? not everyone has a 386? :-). 299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * You can disable use of extended/expanded memory entirely by altering these 319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * definitions or overriding them from the Makefile (eg, -DEMS_SUPPORTED=0). 329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifndef XMS_SUPPORTED 359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define XMS_SUPPORTED 1 369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifndef EMS_SUPPORTED 389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define EMS_SUPPORTED 1 399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define JPEG_INTERNALS 439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include "jinclude.h" 449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include "jpeglib.h" 459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include "jmemsys.h" /* import the system-dependent declarations */ 469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifndef HAVE_STDLIB_H /* <stdlib.h> should declare these */ 489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectextern void * malloc JPP((size_t size)); 499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectextern void free JPP((void *ptr)); 509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectextern char * getenv JPP((const char * name)); 519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef NEED_FAR_POINTERS 549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef __TURBOC__ 569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* These definitions work for Borland C (Turbo C) */ 579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include <alloc.h> /* need farmalloc(), farfree() */ 589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define far_malloc(x) farmalloc(x) 599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define far_free(x) farfree(x) 609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#else 619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* These definitions work for Microsoft C and compatible compilers */ 629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include <malloc.h> /* need _fmalloc(), _ffree() */ 639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define far_malloc(x) _fmalloc(x) 649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define far_free(x) _ffree(x) 659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#else /* not NEED_FAR_POINTERS */ 689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define far_malloc(x) malloc(x) 709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define far_free(x) free(x) 719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif /* NEED_FAR_POINTERS */ 739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef DONT_USE_B_MODE /* define mode parameters for fopen() */ 759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define READ_BINARY "r" 769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#else 779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define READ_BINARY "rb" 789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifndef USE_MSDOS_MEMMGR /* make sure user got configuration right */ 819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project You forgot to define USE_MSDOS_MEMMGR in jconfig.h. /* deliberate syntax error */ 829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#if MAX_ALLOC_CHUNK >= 65535L /* make sure jconfig.h got this right */ 859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project MAX_ALLOC_CHUNK should be less than 64K. /* deliberate syntax error */ 869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Declarations for assembly-language support routines (see jmemdosa.asm). 919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * The functions are declared "far" as are all their pointer arguments; 939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * this ensures the assembly source code will work regardless of the 949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * compiler memory model. We assume "short" is 16 bits, "long" is 32. 959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecttypedef void far * XMSDRIVER; /* actually a pointer to code */ 989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecttypedef struct { /* registers for calling XMS driver */ 999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project unsigned short ax, dx, bx; 1009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project void far * ds_si; 1019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } XMScontext; 1029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecttypedef struct { /* registers for calling EMS driver */ 1039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project unsigned short ax, dx, bx; 1049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project void far * ds_si; 1059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } EMScontext; 1069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectextern short far jdos_open JPP((short far * handle, char far * filename)); 1089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectextern short far jdos_close JPP((short handle)); 1099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectextern short far jdos_seek JPP((short handle, long offset)); 1109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectextern short far jdos_read JPP((short handle, void far * buffer, 1119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project unsigned short count)); 1129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectextern short far jdos_write JPP((short handle, void far * buffer, 1139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project unsigned short count)); 1149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectextern void far jxms_getdriver JPP((XMSDRIVER far *)); 1159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectextern void far jxms_calldriver JPP((XMSDRIVER, XMScontext far *)); 1169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectextern short far jems_available JPP((void)); 1179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectextern void far jems_calldriver JPP((EMScontext far *)); 1189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 1219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Selection of a file name for a temporary file. 1229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This is highly system-dependent, and you may want to customize it. 1239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 1249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectstatic int next_file_num; /* to distinguish among several temp files */ 1269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(void) 1289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectselect_file_name (char * fname) 1299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 1309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project const char * env; 1319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project char * ptr; 1329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project FILE * tfile; 1339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Keep generating file names till we find one that's not in use */ 1359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (;;) { 1369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Get temp directory name from environment TMP or TEMP variable; 1379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * if none, use "." 1389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 1399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if ((env = (const char *) getenv("TMP")) == NULL) 1409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if ((env = (const char *) getenv("TEMP")) == NULL) 1419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project env = "."; 1429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (*env == '\0') /* null string means "." */ 1439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project env = "."; 1449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ptr = fname; /* copy name to fname */ 1459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project while (*env != '\0') 1469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *ptr++ = *env++; 1479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (ptr[-1] != '\\' && ptr[-1] != '/') 1489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *ptr++ = '\\'; /* append backslash if not in env variable */ 1499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Append a suitable file name */ 1509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project next_file_num++; /* advance counter */ 1519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project sprintf(ptr, "JPG%03d.TMP", next_file_num); 1529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Probe to see if file name is already in use */ 1539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if ((tfile = fopen(fname, READ_BINARY)) == NULL) 1549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project break; 1559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fclose(tfile); /* oops, it's there; close tfile & try again */ 1569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 1589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 1619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Near-memory allocation and freeing are controlled by the regular library 1629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * routines malloc() and free(). 1639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 1649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(void *) 1669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectjpeg_get_small (j_common_ptr cinfo, size_t sizeofobject) 1679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 1689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return (void *) malloc(sizeofobject); 1699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 1709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(void) 1729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectjpeg_free_small (j_common_ptr cinfo, void * object, size_t sizeofobject) 1739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 1749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project free(object); 1759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 1769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 1799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * "Large" objects are allocated in far memory, if possible 1809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 1819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(void FAR *) 1839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectjpeg_get_large (j_common_ptr cinfo, size_t sizeofobject) 1849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 1859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return (void FAR *) far_malloc(sizeofobject); 1869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 1879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(void) 1899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectjpeg_free_large (j_common_ptr cinfo, void FAR * object, size_t sizeofobject) 1909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 1919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project far_free(object); 1929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 1939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 1969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This routine computes the total memory space available for allocation. 1979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * It's impossible to do this in a portable way; our current solution is 1989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * to make the user tell us (with a default value set at compile time). 1999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * If you can actually get the available space, it's a good idea to subtract 2009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * a slop factor of 5% or so. 2019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 2029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifndef DEFAULT_MAX_MEM /* so can override from makefile */ 2049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define DEFAULT_MAX_MEM 300000L /* for total usage about 450K */ 2059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 2069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(long) 2089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectjpeg_mem_available (j_common_ptr cinfo, long min_bytes_needed, 2099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project long max_bytes_needed, long already_allocated) 2109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 2119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return cinfo->mem->max_memory_to_use - already_allocated; 2129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 2139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 2169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Backing store (temporary file) management. 2179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Backing store objects are only used when the value returned by 2189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * jpeg_mem_available is less than the total space needed. You can dispense 2199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * with these routines if you have plenty of virtual memory; see jmemnobs.c. 2209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 2219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 2239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * For MS-DOS we support three types of backing storage: 2249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 1. Conventional DOS files. We access these by direct DOS calls rather 2259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * than via the stdio package. This provides a bit better performance, 2269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * but the real reason is that the buffers to be read or written are FAR. 2279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * The stdio library for small-data memory models can't cope with that. 2289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 2. Extended memory, accessed per the XMS V2.0 specification. 2299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 3. Expanded memory, accessed per the LIM/EMS 4.0 specification. 2309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * You'll need copies of those specs to make sense of the related code. 2319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * The specs are available by Internet FTP from the SIMTEL archives 2329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * (oak.oakland.edu and its various mirror sites). See files 2339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * pub/msdos/microsoft/xms20.arc and pub/msdos/info/limems41.zip. 2349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 2359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 2389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Access methods for a DOS file. 2399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 2409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) 2439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectread_file_store (j_common_ptr cinfo, backing_store_ptr info, 2449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project void FAR * buffer_address, 2459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project long file_offset, long byte_count) 2469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 2479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (jdos_seek(info->handle.file_handle, file_offset)) 2489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(cinfo, JERR_TFILE_SEEK); 2499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Since MAX_ALLOC_CHUNK is less than 64K, byte_count will be too. */ 2509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (byte_count > 65535L) /* safety check */ 2519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(cinfo, JERR_BAD_ALLOC_CHUNK); 2529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (jdos_read(info->handle.file_handle, buffer_address, 2539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (unsigned short) byte_count)) 2549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(cinfo, JERR_TFILE_READ); 2559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 2569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) 2599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectwrite_file_store (j_common_ptr cinfo, backing_store_ptr info, 2609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project void FAR * buffer_address, 2619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project long file_offset, long byte_count) 2629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 2639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (jdos_seek(info->handle.file_handle, file_offset)) 2649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(cinfo, JERR_TFILE_SEEK); 2659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Since MAX_ALLOC_CHUNK is less than 64K, byte_count will be too. */ 2669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (byte_count > 65535L) /* safety check */ 2679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(cinfo, JERR_BAD_ALLOC_CHUNK); 2689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (jdos_write(info->handle.file_handle, buffer_address, 2699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (unsigned short) byte_count)) 2709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(cinfo, JERR_TFILE_WRITE); 2719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 2729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) 2759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectclose_file_store (j_common_ptr cinfo, backing_store_ptr info) 2769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 2779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jdos_close(info->handle.file_handle); /* close the file */ 2789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project remove(info->temp_name); /* delete the file */ 2799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* If your system doesn't have remove(), try unlink() instead. 2809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * remove() is the ANSI-standard name for this function, but 2819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * unlink() was more common in pre-ANSI systems. 2829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 2839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project TRACEMSS(cinfo, 1, JTRC_TFILE_CLOSE, info->temp_name); 2849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 2859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(boolean) 2889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectopen_file_store (j_common_ptr cinfo, backing_store_ptr info, 2899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project long total_bytes_needed) 2909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 2919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project short handle; 2929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project select_file_name(info->temp_name); 2949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (jdos_open((short far *) & handle, (char far *) info->temp_name)) { 2959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* might as well exit since jpeg_open_backing_store will fail anyway */ 2969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXITS(cinfo, JERR_TFILE_CREATE, info->temp_name); 2979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return FALSE; 2989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project info->handle.file_handle = handle; 3009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project info->read_backing_store = read_file_store; 3019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project info->write_backing_store = write_file_store; 3029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project info->close_backing_store = close_file_store; 3039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project TRACEMSS(cinfo, 1, JTRC_TFILE_OPEN, info->temp_name); 3049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return TRUE; /* succeeded */ 3059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 3069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 3099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Access methods for extended memory. 3109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 3119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#if XMS_SUPPORTED 3139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectstatic XMSDRIVER xms_driver; /* saved address of XMS driver */ 3159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecttypedef union { /* either long offset or real-mode pointer */ 3179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project long offset; 3189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project void far * ptr; 3199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } XMSPTR; 3209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecttypedef struct { /* XMS move specification structure */ 3229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project long length; 3239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project XMSH src_handle; 3249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project XMSPTR src; 3259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project XMSH dst_handle; 3269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project XMSPTR dst; 3279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } XMSspec; 3289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define ODD(X) (((X) & 1L) != 0) 3309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) 3339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectread_xms_store (j_common_ptr cinfo, backing_store_ptr info, 3349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project void FAR * buffer_address, 3359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project long file_offset, long byte_count) 3369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 3379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project XMScontext ctx; 3389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project XMSspec spec; 3399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project char endbuffer[2]; 3409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* The XMS driver can't cope with an odd length, so handle the last byte 3429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * specially if byte_count is odd. We don't expect this to be common. 3439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 3449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project spec.length = byte_count & (~ 1L); 3469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project spec.src_handle = info->handle.xms_handle; 3479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project spec.src.offset = file_offset; 3489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project spec.dst_handle = 0; 3499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project spec.dst.ptr = buffer_address; 3509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ctx.ds_si = (void far *) & spec; 3529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ctx.ax = 0x0b00; /* EMB move */ 3539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jxms_calldriver(xms_driver, (XMScontext far *) & ctx); 3549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (ctx.ax != 1) 3559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(cinfo, JERR_XMS_READ); 3569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (ODD(byte_count)) { 3589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project read_xms_store(cinfo, info, (void FAR *) endbuffer, 3599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project file_offset + byte_count - 1L, 2L); 3609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ((char FAR *) buffer_address)[byte_count - 1L] = endbuffer[0]; 3619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 3629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 3639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) 3669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectwrite_xms_store (j_common_ptr cinfo, backing_store_ptr info, 3679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project void FAR * buffer_address, 3689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project long file_offset, long byte_count) 3699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 3709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project XMScontext ctx; 3719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project XMSspec spec; 3729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project char endbuffer[2]; 3739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* The XMS driver can't cope with an odd length, so handle the last byte 3759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * specially if byte_count is odd. We don't expect this to be common. 3769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 3779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project spec.length = byte_count & (~ 1L); 3799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project spec.src_handle = 0; 3809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project spec.src.ptr = buffer_address; 3819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project spec.dst_handle = info->handle.xms_handle; 3829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project spec.dst.offset = file_offset; 3839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ctx.ds_si = (void far *) & spec; 3859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ctx.ax = 0x0b00; /* EMB move */ 3869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jxms_calldriver(xms_driver, (XMScontext far *) & ctx); 3879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (ctx.ax != 1) 3889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(cinfo, JERR_XMS_WRITE); 3899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (ODD(byte_count)) { 3919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project read_xms_store(cinfo, info, (void FAR *) endbuffer, 3929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project file_offset + byte_count - 1L, 2L); 3939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project endbuffer[0] = ((char FAR *) buffer_address)[byte_count - 1L]; 3949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project write_xms_store(cinfo, info, (void FAR *) endbuffer, 3959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project file_offset + byte_count - 1L, 2L); 3969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 3979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 3989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) 4019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectclose_xms_store (j_common_ptr cinfo, backing_store_ptr info) 4029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 4039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project XMScontext ctx; 4049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ctx.dx = info->handle.xms_handle; 4069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ctx.ax = 0x0a00; 4079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jxms_calldriver(xms_driver, (XMScontext far *) & ctx); 4089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project TRACEMS1(cinfo, 1, JTRC_XMS_CLOSE, info->handle.xms_handle); 4099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* we ignore any error return from the driver */ 4109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 4119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(boolean) 4149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectopen_xms_store (j_common_ptr cinfo, backing_store_ptr info, 4159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project long total_bytes_needed) 4169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 4179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project XMScontext ctx; 4189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Get address of XMS driver */ 4209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jxms_getdriver((XMSDRIVER far *) & xms_driver); 4219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (xms_driver == NULL) 4229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return FALSE; /* no driver to be had */ 4239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Get version number, must be >= 2.00 */ 4259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ctx.ax = 0x0000; 4269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jxms_calldriver(xms_driver, (XMScontext far *) & ctx); 4279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (ctx.ax < (unsigned short) 0x0200) 4289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return FALSE; 4299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Try to get space (expressed in kilobytes) */ 4319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ctx.dx = (unsigned short) ((total_bytes_needed + 1023L) >> 10); 4329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ctx.ax = 0x0900; 4339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jxms_calldriver(xms_driver, (XMScontext far *) & ctx); 4349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (ctx.ax != 1) 4359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return FALSE; 4369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Succeeded, save the handle and away we go */ 4389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project info->handle.xms_handle = ctx.dx; 4399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project info->read_backing_store = read_xms_store; 4409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project info->write_backing_store = write_xms_store; 4419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project info->close_backing_store = close_xms_store; 4429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project TRACEMS1(cinfo, 1, JTRC_XMS_OPEN, ctx.dx); 4439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return TRUE; /* succeeded */ 4449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 4459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif /* XMS_SUPPORTED */ 4479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 4509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Access methods for expanded memory. 4519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 4529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#if EMS_SUPPORTED 4549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* The EMS move specification structure requires word and long fields aligned 4569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * at odd byte boundaries. Some compilers will align struct fields at even 4579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * byte boundaries. While it's usually possible to force byte alignment, 4589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * that causes an overall performance penalty and may pose problems in merging 4599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * JPEG into a larger application. Instead we accept some rather dirty code 4609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * here. Note this code would fail if the hardware did not allow odd-byte 4619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * word & long accesses, but all 80x86 CPUs do. 4629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 4639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecttypedef void far * EMSPTR; 4659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecttypedef union { /* EMS move specification structure */ 4679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project long length; /* It's easy to access first 4 bytes */ 4689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project char bytes[18]; /* Misaligned fields in here! */ 4699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } EMSspec; 4709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Macros for accessing misaligned fields */ 4729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define FIELD_AT(spec,offset,type) (*((type *) &(spec.bytes[offset]))) 4739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define SRC_TYPE(spec) FIELD_AT(spec,4,char) 4749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define SRC_HANDLE(spec) FIELD_AT(spec,5,EMSH) 4759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define SRC_OFFSET(spec) FIELD_AT(spec,7,unsigned short) 4769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define SRC_PAGE(spec) FIELD_AT(spec,9,unsigned short) 4779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define SRC_PTR(spec) FIELD_AT(spec,7,EMSPTR) 4789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define DST_TYPE(spec) FIELD_AT(spec,11,char) 4799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define DST_HANDLE(spec) FIELD_AT(spec,12,EMSH) 4809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define DST_OFFSET(spec) FIELD_AT(spec,14,unsigned short) 4819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define DST_PAGE(spec) FIELD_AT(spec,16,unsigned short) 4829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define DST_PTR(spec) FIELD_AT(spec,14,EMSPTR) 4839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define EMSPAGESIZE 16384L /* gospel, see the EMS specs */ 4859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define HIBYTE(W) (((W) >> 8) & 0xFF) 4879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define LOBYTE(W) ((W) & 0xFF) 4889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) 4919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectread_ems_store (j_common_ptr cinfo, backing_store_ptr info, 4929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project void FAR * buffer_address, 4939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project long file_offset, long byte_count) 4949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 4959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project EMScontext ctx; 4969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project EMSspec spec; 4979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project spec.length = byte_count; 4999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project SRC_TYPE(spec) = 1; 5009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project SRC_HANDLE(spec) = info->handle.ems_handle; 5019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project SRC_PAGE(spec) = (unsigned short) (file_offset / EMSPAGESIZE); 5029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project SRC_OFFSET(spec) = (unsigned short) (file_offset % EMSPAGESIZE); 5039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project DST_TYPE(spec) = 0; 5049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project DST_HANDLE(spec) = 0; 5059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project DST_PTR(spec) = buffer_address; 5069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 5079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ctx.ds_si = (void far *) & spec; 5089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ctx.ax = 0x5700; /* move memory region */ 5099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jems_calldriver((EMScontext far *) & ctx); 5109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (HIBYTE(ctx.ax) != 0) 5119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(cinfo, JERR_EMS_READ); 5129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 5139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 5149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 5159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) 5169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectwrite_ems_store (j_common_ptr cinfo, backing_store_ptr info, 5179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project void FAR * buffer_address, 5189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project long file_offset, long byte_count) 5199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 5209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project EMScontext ctx; 5219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project EMSspec spec; 5229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 5239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project spec.length = byte_count; 5249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project SRC_TYPE(spec) = 0; 5259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project SRC_HANDLE(spec) = 0; 5269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project SRC_PTR(spec) = buffer_address; 5279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project DST_TYPE(spec) = 1; 5289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project DST_HANDLE(spec) = info->handle.ems_handle; 5299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project DST_PAGE(spec) = (unsigned short) (file_offset / EMSPAGESIZE); 5309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project DST_OFFSET(spec) = (unsigned short) (file_offset % EMSPAGESIZE); 5319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 5329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ctx.ds_si = (void far *) & spec; 5339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ctx.ax = 0x5700; /* move memory region */ 5349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jems_calldriver((EMScontext far *) & ctx); 5359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (HIBYTE(ctx.ax) != 0) 5369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(cinfo, JERR_EMS_WRITE); 5379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 5389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 5399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 5409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) 5419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectclose_ems_store (j_common_ptr cinfo, backing_store_ptr info) 5429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 5439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project EMScontext ctx; 5449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 5459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ctx.ax = 0x4500; 5469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ctx.dx = info->handle.ems_handle; 5479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jems_calldriver((EMScontext far *) & ctx); 5489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project TRACEMS1(cinfo, 1, JTRC_EMS_CLOSE, info->handle.ems_handle); 5499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* we ignore any error return from the driver */ 5509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 5519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 5529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 5539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(boolean) 5549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectopen_ems_store (j_common_ptr cinfo, backing_store_ptr info, 5559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project long total_bytes_needed) 5569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 5579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project EMScontext ctx; 5589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 5599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Is EMS driver there? */ 5609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (! jems_available()) 5619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return FALSE; 5629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 5639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Get status, make sure EMS is OK */ 5649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ctx.ax = 0x4000; 5659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jems_calldriver((EMScontext far *) & ctx); 5669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (HIBYTE(ctx.ax) != 0) 5679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return FALSE; 5689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 5699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Get version, must be >= 4.0 */ 5709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ctx.ax = 0x4600; 5719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jems_calldriver((EMScontext far *) & ctx); 5729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (HIBYTE(ctx.ax) != 0 || LOBYTE(ctx.ax) < 0x40) 5739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return FALSE; 5749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 5759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Try to allocate requested space */ 5769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ctx.ax = 0x4300; 5779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ctx.bx = (unsigned short) ((total_bytes_needed + EMSPAGESIZE-1L) / EMSPAGESIZE); 5789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jems_calldriver((EMScontext far *) & ctx); 5799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (HIBYTE(ctx.ax) != 0) 5809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return FALSE; 5819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 5829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Succeeded, save the handle and away we go */ 5839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project info->handle.ems_handle = ctx.dx; 5849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project info->read_backing_store = read_ems_store; 5859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project info->write_backing_store = write_ems_store; 5869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project info->close_backing_store = close_ems_store; 5879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project TRACEMS1(cinfo, 1, JTRC_EMS_OPEN, ctx.dx); 5889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return TRUE; /* succeeded */ 5899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 5909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 5919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif /* EMS_SUPPORTED */ 5929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 5939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 5949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 5959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Initial opening of a backing-store object. 5969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 5979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 5989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(void) 5999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectjpeg_open_backing_store (j_common_ptr cinfo, backing_store_ptr info, 6009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project long total_bytes_needed) 6019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 6029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Try extended memory, then expanded memory, then regular file. */ 6039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#if XMS_SUPPORTED 6049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (open_xms_store(cinfo, info, total_bytes_needed)) 6059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return; 6069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 6079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#if EMS_SUPPORTED 6089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (open_ems_store(cinfo, info, total_bytes_needed)) 6099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return; 6109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 6119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (open_file_store(cinfo, info, total_bytes_needed)) 6129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return; 6139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXITS(cinfo, JERR_TFILE_CREATE, ""); 6149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 6159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 6169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 6179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 6189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * These routines take care of any system-dependent initialization and 6199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * cleanup required. 6209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 6219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 6229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(long) 6239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectjpeg_mem_init (j_common_ptr cinfo) 6249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 6259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project next_file_num = 0; /* initialize temp file name generator */ 6269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return DEFAULT_MAX_MEM; /* default for max_memory_to_use */ 6279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 6289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 6299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(void) 6309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectjpeg_mem_term (j_common_ptr cinfo) 6319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 6329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Microsoft C, at least in v6.00A, will not successfully reclaim freed 6339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * blocks of size > 32Kbytes unless we give it a kick in the rear, like so: 6349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 6359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef NEED_FHEAPMIN 6369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project _fheapmin(); 6379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 6389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 639