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