⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jmemmac.c

📁 Jpeg source code,jpeg编码解码示范
💻 C
字号:
/* * jmemmac.c * * Copyright (C) 1992-1996, Thomas G. Lane. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * * jmemmac.c provides an Apple Macintosh implementation of the system- * dependent portion of the JPEG memory manager. * * jmemmac.c uses the Macintosh toolbox routines NewPtr and DisposePtr * instead of malloc and free.  It accurately determines the amount of * memory available by using CompactMem.  Notice that if left to its * own devices, this code can chew up all available space in the * application's zone, with the exception of the rather small "slop" * factor computed in jpeg_mem_available().  The application can ensure * that more space is left over by reducing max_memory_to_use. * * Large images are swapped to disk using temporary files created with * tmpfile(); that part of the module is the same as in jmemansi.c. * Metrowerks CodeWarrior's implementation of tmpfile() isn't quite what * we want: it puts the files in the local directory and makes them * user-visible -- and only deletes them when the application quits, * which means they stick around in the event of a crash. * It would be better to create the temp files in the system's temporary * items folder.  Perhaps someday we'll get around to doing that. * * Contributed by Sam Bushell (jsam@iagu.on.net). */#define JPEG_INTERNALS#include "jinclude.h"#include "jpeglib.h"#include "jmemsys.h"		/* import the system-dependent declarations */#include <Memory.h>		/* we use the MacOS memory manager */#ifndef SEEK_SET		/* pre-ANSI systems may not define this; */#define SEEK_SET  0		/* if not, assume 0 is correct */#endif/* * Memory allocation and freeing are controlled by the MacOS library * routines NewPtr() and DisposePtr(), which allocate fixed-address * storage.  Unfortunately, the IJG library isn't smart enough to cope * with relocatable storage. */GLOBAL(void *)jpeg_get_small (j_common_ptr cinfo, size_t sizeofobject){  return (void *) NewPtr(sizeofobject);}GLOBAL(void)jpeg_free_small (j_common_ptr cinfo, void * object, size_t sizeofobject){  DisposePtr((Ptr) object);}/* * "Large" objects are treated the same as "small" ones. * NB: we include FAR keywords in the routine declarations simply for * consistency with the rest of the IJG code; FAR should expand to empty * on rational architectures like the Mac. */GLOBAL(void FAR *)jpeg_get_large (j_common_ptr cinfo, size_t sizeofobject){  return (void FAR *) NewPtr(sizeofobject);}GLOBAL(void)jpeg_free_large (j_common_ptr cinfo, void FAR * object, size_t sizeofobject){  DisposePtr((Ptr) object);}/* * This routine computes the total memory space available for allocation. */GLOBAL(long)jpeg_mem_available (j_common_ptr cinfo, long min_bytes_needed,		    long max_bytes_needed, long already_allocated){  long limit = cinfo->mem->max_memory_to_use - already_allocated;  long slop, mem;  /* Don't ask for more than what application has told us we may use */  if (max_bytes_needed > limit && limit > 0)    max_bytes_needed = limit;  /* Find whether there's a big enough free block in the heap.   * CompactMem tries to create a contiguous block of the requested size,   * and then returns the size of the largest free block (which could be   * much more or much less than we asked for).   * We add some slop to ensure we don't use up all available memory.   */  slop = max_bytes_needed / 16 + 32768L;  mem = CompactMem(max_bytes_needed + slop) - slop;  if (mem < 0)    mem = 0;			/* sigh, couldn't even get the slop */  /* Don't take more than the application says we can have */  if (mem > limit && limit > 0)    mem = limit;  return mem;}/* * Backing store (temporary file) management. * Backing store objects are only used when the value returned by * jpeg_mem_available is less than the total space needed.  You can dispense * with these routines if you have plenty of virtual memory; see jmemnobs.c. */METHODDEF(void)read_backing_store (j_common_ptr cinfo, backing_store_ptr info,		    void FAR * buffer_address,		    long file_offset, long byte_count){  if (fseek(info->temp_file, file_offset, SEEK_SET))    ERREXIT(cinfo, JERR_TFILE_SEEK);  if (JFREAD(info->temp_file, buffer_address, byte_count)      != (size_t) byte_count)    ERREXIT(cinfo, JERR_TFILE_READ);}METHODDEF(void)write_backing_store (j_common_ptr cinfo, backing_store_ptr info,		     void FAR * buffer_address,		     long file_offset, long byte_count){  if (fseek(info->temp_file, file_offset, SEEK_SET))    ERREXIT(cinfo, JERR_TFILE_SEEK);  if (JFWRITE(info->temp_file, buffer_address, byte_count)      != (size_t) byte_count)    ERREXIT(cinfo, JERR_TFILE_WRITE);}METHODDEF(void)close_backing_store (j_common_ptr cinfo, backing_store_ptr info){  fclose(info->temp_file);  /* Since this implementation uses tmpfile() to create the file,   * no explicit file deletion is needed.   */}/* * Initial opening of a backing-store object. * * This version uses tmpfile(), which constructs a suitable file name * behind the scenes.  We don't have to use info->temp_name[] at all; * indeed, we can't even find out the actual name of the temp file. */GLOBAL(void)jpeg_open_backing_store (j_common_ptr cinfo, backing_store_ptr info,			 long total_bytes_needed){  if ((info->temp_file = tmpfile()) == NULL)    ERREXITS(cinfo, JERR_TFILE_CREATE, "");  info->read_backing_store = read_backing_store;  info->write_backing_store = write_backing_store;  info->close_backing_store = close_backing_store;}/* * These routines take care of any system-dependent initialization and * cleanup required. */GLOBAL(long)jpeg_mem_init (j_common_ptr cinfo){  /* max_memory_to_use will be initialized to FreeMem()'s result;   * the calling application might later reduce it, for example   * to leave room to invoke multiple JPEG objects.   * Note that FreeMem returns the total number of free bytes;   * it may not be possible to allocate a single block of this size.   */  return FreeMem();}GLOBAL(void)jpeg_mem_term (j_common_ptr cinfo){  /* no work */}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -