19f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
29f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Copyright (C) 2007-2008 The Android Open Source Project
39f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *
49f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * you may not use this file except in compliance with the License.
69f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * You may obtain a copy of the License at
79f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *
89f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *
109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * See the License for the specific language governing permissions and
149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * limitations under the License.
159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define JPEG_INTERNALS
189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include "jinclude.h"
199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include "jpeglib.h"
209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include "jmemsys.h"		/* import the system-dependent declarations */
219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifndef HAVE_STDLIB_H		/* <stdlib.h> should declare malloc(),free() */
239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectextern void * malloc JPP((size_t size));
249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectextern void free JPP((void *ptr));
259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif
269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifndef SEEK_SET		/* pre-ANSI systems may not define this; */
289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define SEEK_SET  0		/* if not, assume 0 is correct */
299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif
309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Memory allocation and freeing are controlled by the regular library
349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * routines malloc() and free().
359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(void *)
389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectjpeg_get_small (j_common_ptr cinfo, size_t sizeofobject)
399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  return (void *) malloc(sizeofobject);
419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(void)
449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectjpeg_free_small (j_common_ptr cinfo, void * object, size_t sizeofobject)
459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  free(object);
479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * "Large" objects are treated the same as "small" ones.
529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * NB: although we include FAR keywords in the routine declarations,
539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * this file won't actually work in 80x86 small/medium model; at least,
549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * you probably won't be able to process useful-size images in only 64KB.
559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(void FAR *)
589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectjpeg_get_large (j_common_ptr cinfo, size_t sizeofobject)
599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  return (void FAR *) malloc(sizeofobject);
619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(void)
649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectjpeg_free_large (j_common_ptr cinfo, void FAR * object, size_t sizeofobject)
659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  free(object);
679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This routine computes the total memory space available for allocation.
729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * It's impossible to do this in a portable way; our current solution is
739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * to make the user tell us (with a default value set at compile time).
749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * If you can actually get the available space, it's a good idea to subtract
759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * a slop factor of 5% or so.
769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifndef DEFAULT_MAX_MEM		/* so can override from makefile */
799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define DEFAULT_MAX_MEM		10000000L /* default: ten megabyte */
809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif
819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(long)
839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectjpeg_mem_available (j_common_ptr cinfo, long min_bytes_needed,
849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project		    long max_bytes_needed, long already_allocated)
859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  return cinfo->mem->max_memory_to_use - already_allocated;
879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Backing store (temporary file) management.
929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Backing store objects are only used when the value returned by
939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * jpeg_mem_available is less than the total space needed.  You can dispense
949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * with these routines if you have plenty of virtual memory; see jmemnobs.c.
959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void)
999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectread_backing_store (j_common_ptr cinfo, backing_store_ptr info,
1009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project		    void FAR * buffer_address,
1019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project		    long file_offset, long byte_count)
1029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
1039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (fseek(info->temp_file, file_offset, SEEK_SET))
1049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ERREXIT(cinfo, JERR_TFILE_SEEK);
1059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (JFREAD(info->temp_file, buffer_address, byte_count)
1069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      != (size_t) byte_count)
1079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ERREXIT(cinfo, JERR_TFILE_READ);
1089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
1099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void)
1129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectwrite_backing_store (j_common_ptr cinfo, backing_store_ptr info,
1139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project		     void FAR * buffer_address,
1149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project		     long file_offset, long byte_count)
1159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
1169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (fseek(info->temp_file, file_offset, SEEK_SET))
1179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ERREXIT(cinfo, JERR_TFILE_SEEK);
1189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (JFWRITE(info->temp_file, buffer_address, byte_count)
1199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      != (size_t) byte_count)
1209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ERREXIT(cinfo, JERR_TFILE_WRITE);
1219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
1229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void)
1259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectclose_backing_store (j_common_ptr cinfo, backing_store_ptr info)
1269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
1279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  fclose(info->temp_file);
1289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Since this implementation uses tmpfile() to create the file,
1299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * no explicit file deletion is needed.
1309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   */
1319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
1329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectstatic FILE* getTempFileFromPath(const char * path) {
1349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    FILE * fd = fopen(path, "w+");
1359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    unlink(path);
1369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    return fd;
1379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
1389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectstatic FILE* getTempFile() {
1409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    char path[1024];
1419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    snprintf(path, 1023, "/sdcard/.%d.tmp", getpid());
1429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    FILE * fd = getTempFileFromPath(path);
1439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (fd == NULL) {
1449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project        // anywhere else we can create a temp file?
1459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project		//	    snprintf(path, 1023, "/data/data/.%d.tmp", getpid());
1469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project		//      fd = getTempFileFromPath(path);
1479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
1489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    return fd;
1499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
1509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
1529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Initial opening of a backing-store object.
1539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *
1549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This version uses tmpfile(), which constructs a suitable file name
1559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * behind the scenes.  We don't have to use info->temp_name[] at all;
1569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * indeed, we can't even find out the actual name of the temp file.
1579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
1589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(void)
1609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectjpeg_open_backing_store (j_common_ptr cinfo, backing_store_ptr info,
1619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project			 long total_bytes_needed)
1629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
1639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if ((info->temp_file = getTempFile()) == NULL)
1649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ERREXITS(cinfo, JERR_TFILE_CREATE, "");
1659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  info->read_backing_store = read_backing_store;
1669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  info->write_backing_store = write_backing_store;
1679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  info->close_backing_store = close_backing_store;
1689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
1699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
1729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * These routines take care of any system-dependent initialization and
1739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * cleanup required.
1749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
1759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(long)
1779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectjpeg_mem_init (j_common_ptr cinfo)
1789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
1799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  return DEFAULT_MAX_MEM;	/* default for max_memory_to_use */
1809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
1819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(void)
1839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectjpeg_mem_term (j_common_ptr cinfo)
1849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
1859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* no work */
1869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
187