12c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen/* 22c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen * Copyright (C) 2010 The Android Open Source Project 32c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen * 42c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen * Licensed under the Apache License, Version 2.0 (the "License"); 52c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen * you may not use this file except in compliance with the License. 62c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen * You may obtain a copy of the License at 72c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen * 82c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen * http://www.apache.org/licenses/LICENSE-2.0 92c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen * 102c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen * Unless required by applicable law or agreed to in writing, software 112c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen * distributed under the License is distributed on an "AS IS" BASIS, 122c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen * See the License for the specific language governing permissions and 142c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen * limitations under the License. 152c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen */ 162c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen 172c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen#include "SkJpegUtility.h" 182c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen 192c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen///////////////////////////////////////////////////////////////////// 202c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chenstatic void sk_init_source(j_decompress_ptr cinfo) { 212c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen skjpeg_source_mgr* src = (skjpeg_source_mgr*)cinfo->src; 222c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen src->next_input_byte = (const JOCTET*)src->fBuffer; 232c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen src->bytes_in_buffer = 0; 2497fa2e455b2040c99c5b6f3e3d2ad6c9b4062081Joseph Wen src->current_offset = 0; 2597fa2e455b2040c99c5b6f3e3d2ad6c9b4062081Joseph Wen src->fStream->rewind(); 2697fa2e455b2040c99c5b6f3e3d2ad6c9b4062081Joseph Wen} 2797fa2e455b2040c99c5b6f3e3d2ad6c9b4062081Joseph Wen 2897fa2e455b2040c99c5b6f3e3d2ad6c9b4062081Joseph Wenstatic boolean sk_seek_input_data(j_decompress_ptr cinfo, long byte_offset) { 2997fa2e455b2040c99c5b6f3e3d2ad6c9b4062081Joseph Wen skjpeg_source_mgr* src = (skjpeg_source_mgr*)cinfo->src; 3097fa2e455b2040c99c5b6f3e3d2ad6c9b4062081Joseph Wen 3197fa2e455b2040c99c5b6f3e3d2ad6c9b4062081Joseph Wen if (byte_offset > src->current_offset) { 3297fa2e455b2040c99c5b6f3e3d2ad6c9b4062081Joseph Wen (void)src->fStream->skip(byte_offset - src->current_offset); 3397fa2e455b2040c99c5b6f3e3d2ad6c9b4062081Joseph Wen } else { 3497fa2e455b2040c99c5b6f3e3d2ad6c9b4062081Joseph Wen src->fStream->rewind(); 3597fa2e455b2040c99c5b6f3e3d2ad6c9b4062081Joseph Wen (void)src->fStream->skip(byte_offset); 3697fa2e455b2040c99c5b6f3e3d2ad6c9b4062081Joseph Wen } 3797fa2e455b2040c99c5b6f3e3d2ad6c9b4062081Joseph Wen 3897fa2e455b2040c99c5b6f3e3d2ad6c9b4062081Joseph Wen src->current_offset = byte_offset; 3997fa2e455b2040c99c5b6f3e3d2ad6c9b4062081Joseph Wen src->next_input_byte = (const JOCTET*)src->fBuffer; 4097fa2e455b2040c99c5b6f3e3d2ad6c9b4062081Joseph Wen src->bytes_in_buffer = 0; 4197fa2e455b2040c99c5b6f3e3d2ad6c9b4062081Joseph Wen return TRUE; 422c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen} 432c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen 442c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chenstatic boolean sk_fill_input_buffer(j_decompress_ptr cinfo) { 452c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen skjpeg_source_mgr* src = (skjpeg_source_mgr*)cinfo->src; 462c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen if (src->fDecoder != NULL && src->fDecoder->shouldCancelDecode()) { 472c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen return FALSE; 482c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen } 492c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen size_t bytes = src->fStream->read(src->fBuffer, skjpeg_source_mgr::kBufferSize); 502c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen // note that JPEG is happy with less than the full read, 512c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen // as long as the result is non-zero 522c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen if (bytes == 0) { 532c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen return FALSE; 542c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen } 552c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen 5697fa2e455b2040c99c5b6f3e3d2ad6c9b4062081Joseph Wen src->current_offset += bytes; 572c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen src->next_input_byte = (const JOCTET*)src->fBuffer; 582c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen src->bytes_in_buffer = bytes; 592c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen return TRUE; 602c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen} 612c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen 622c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chenstatic void sk_skip_input_data(j_decompress_ptr cinfo, long num_bytes) { 632c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen skjpeg_source_mgr* src = (skjpeg_source_mgr*)cinfo->src; 642c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen 650a81c953145c77abea5ca1df9e84c62d9da96094Mike Reed if (num_bytes > (long)src->bytes_in_buffer) { 6679ecb8005fc8987f5adaea60521671c878c2e2d4Mike Reed long bytesToSkip = num_bytes - src->bytes_in_buffer; 6779ecb8005fc8987f5adaea60521671c878c2e2d4Mike Reed while (bytesToSkip > 0) { 6879ecb8005fc8987f5adaea60521671c878c2e2d4Mike Reed long bytes = (long)src->fStream->skip(bytesToSkip); 6979ecb8005fc8987f5adaea60521671c878c2e2d4Mike Reed if (bytes <= 0 || bytes > bytesToSkip) { 7079ecb8005fc8987f5adaea60521671c878c2e2d4Mike Reed// SkDebugf("xxxxxxxxxxxxxx failure to skip request %d returned %d\n", bytesToSkip, bytes); 7179ecb8005fc8987f5adaea60521671c878c2e2d4Mike Reed cinfo->err->error_exit((j_common_ptr)cinfo); 7279ecb8005fc8987f5adaea60521671c878c2e2d4Mike Reed return; 7379ecb8005fc8987f5adaea60521671c878c2e2d4Mike Reed } 7497fa2e455b2040c99c5b6f3e3d2ad6c9b4062081Joseph Wen src->current_offset += bytes; 7579ecb8005fc8987f5adaea60521671c878c2e2d4Mike Reed bytesToSkip -= bytes; 762c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen } 772c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen src->next_input_byte = (const JOCTET*)src->fBuffer; 782c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen src->bytes_in_buffer = 0; 792c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen } else { 802c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen src->next_input_byte += num_bytes; 812c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen src->bytes_in_buffer -= num_bytes; 822c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen } 832c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen} 842c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen 852c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chenstatic boolean sk_resync_to_restart(j_decompress_ptr cinfo, int desired) { 862c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen skjpeg_source_mgr* src = (skjpeg_source_mgr*)cinfo->src; 872c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen 882c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen // what is the desired param for??? 892c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen 902c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen if (!src->fStream->rewind()) { 912c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen SkDebugf("xxxxxxxxxxxxxx failure to rewind\n"); 922c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen cinfo->err->error_exit((j_common_ptr)cinfo); 932c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen return FALSE; 942c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen } 952c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen src->next_input_byte = (const JOCTET*)src->fBuffer; 962c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen src->bytes_in_buffer = 0; 972c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen return TRUE; 982c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen} 992c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen 1002c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chenstatic void sk_term_source(j_decompress_ptr /*cinfo*/) {} 1012c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen 1022c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen 1032c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chenstatic void skmem_init_source(j_decompress_ptr cinfo) { 1042c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen skjpeg_source_mgr* src = (skjpeg_source_mgr*)cinfo->src; 1052c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen src->next_input_byte = (const JOCTET*)src->fMemoryBase; 10697fa2e455b2040c99c5b6f3e3d2ad6c9b4062081Joseph Wen src->start_input_byte = (const JOCTET*)src->fMemoryBase; 1072c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen src->bytes_in_buffer = src->fMemoryBaseSize; 10897fa2e455b2040c99c5b6f3e3d2ad6c9b4062081Joseph Wen src->current_offset = src->fMemoryBaseSize; 1092c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen} 1102c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen 1112c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chenstatic boolean skmem_fill_input_buffer(j_decompress_ptr cinfo) { 1122c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen SkDebugf("xxxxxxxxxxxxxx skmem_fill_input_buffer called\n"); 1132c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen return FALSE; 1142c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen} 1152c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen 1162c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chenstatic void skmem_skip_input_data(j_decompress_ptr cinfo, long num_bytes) { 1172c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen skjpeg_source_mgr* src = (skjpeg_source_mgr*)cinfo->src; 1182c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen// SkDebugf("xxxxxxxxxxxxxx skmem_skip_input_data called %d\n", num_bytes); 1192c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen src->next_input_byte = (const JOCTET*)((const char*)src->next_input_byte + num_bytes); 1202c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen src->bytes_in_buffer -= num_bytes; 1212c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen} 1222c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen 1232c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chenstatic boolean skmem_resync_to_restart(j_decompress_ptr cinfo, int desired) { 1242c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen SkDebugf("xxxxxxxxxxxxxx skmem_resync_to_restart called\n"); 1252c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen return TRUE; 1262c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen} 1272c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen 1282c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chenstatic void skmem_term_source(j_decompress_ptr /*cinfo*/) {} 1292c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen 1302c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen 1312c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen/////////////////////////////////////////////////////////////////////////////// 1322c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen 13397fa2e455b2040c99c5b6f3e3d2ad6c9b4062081Joseph Wenskjpeg_source_mgr::skjpeg_source_mgr(SkStream* stream, SkImageDecoder* decoder, 1343a1cc9700bf928ed3b1e05c7edc543124440c54cJoseph Wen bool ownStream) : fStream(stream) { 1352c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen fDecoder = decoder; 1362c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen const void* baseAddr = stream->getMemoryBase(); 137ea22e42026418b6b9919a94ff04930c978c4c777Joseph Wen size_t bufferSize = 4096; 138ea22e42026418b6b9919a94ff04930c978c4c777Joseph Wen size_t len; 13997fa2e455b2040c99c5b6f3e3d2ad6c9b4062081Joseph Wen fMemoryBase = NULL; 14097fa2e455b2040c99c5b6f3e3d2ad6c9b4062081Joseph Wen fUnrefStream = ownStream; 1413a1cc9700bf928ed3b1e05c7edc543124440c54cJoseph Wen fMemoryBaseSize = 0; 1423a1cc9700bf928ed3b1e05c7edc543124440c54cJoseph Wen 1433a1cc9700bf928ed3b1e05c7edc543124440c54cJoseph Wen init_source = sk_init_source; 1443a1cc9700bf928ed3b1e05c7edc543124440c54cJoseph Wen fill_input_buffer = sk_fill_input_buffer; 1453a1cc9700bf928ed3b1e05c7edc543124440c54cJoseph Wen skip_input_data = sk_skip_input_data; 1463a1cc9700bf928ed3b1e05c7edc543124440c54cJoseph Wen resync_to_restart = sk_resync_to_restart; 1473a1cc9700bf928ed3b1e05c7edc543124440c54cJoseph Wen term_source = sk_term_source; 1483a1cc9700bf928ed3b1e05c7edc543124440c54cJoseph Wen seek_input_data = sk_seek_input_data; 1492c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen// SkDebugf("**************** use memorybase %p %d\n", fMemoryBase, fMemoryBaseSize); 1502c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen} 1512c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen 15297fa2e455b2040c99c5b6f3e3d2ad6c9b4062081Joseph Wenskjpeg_source_mgr::~skjpeg_source_mgr() { 15397fa2e455b2040c99c5b6f3e3d2ad6c9b4062081Joseph Wen if (fMemoryBase) { 15497fa2e455b2040c99c5b6f3e3d2ad6c9b4062081Joseph Wen sk_free(fMemoryBase); 15597fa2e455b2040c99c5b6f3e3d2ad6c9b4062081Joseph Wen } 15697fa2e455b2040c99c5b6f3e3d2ad6c9b4062081Joseph Wen if (fUnrefStream) { 15797fa2e455b2040c99c5b6f3e3d2ad6c9b4062081Joseph Wen fStream->unref(); 15897fa2e455b2040c99c5b6f3e3d2ad6c9b4062081Joseph Wen } 15997fa2e455b2040c99c5b6f3e3d2ad6c9b4062081Joseph Wen} 16097fa2e455b2040c99c5b6f3e3d2ad6c9b4062081Joseph Wen 1612c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen/////////////////////////////////////////////////////////////////////////////// 1622c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen 1632c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chenstatic void sk_init_destination(j_compress_ptr cinfo) { 1642c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen skjpeg_destination_mgr* dest = (skjpeg_destination_mgr*)cinfo->dest; 1652c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen 1662c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen dest->next_output_byte = dest->fBuffer; 1672c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen dest->free_in_buffer = skjpeg_destination_mgr::kBufferSize; 1682c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen} 1692c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen 1702c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chenstatic boolean sk_empty_output_buffer(j_compress_ptr cinfo) { 1712c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen skjpeg_destination_mgr* dest = (skjpeg_destination_mgr*)cinfo->dest; 1722c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen 1732c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen// if (!dest->fStream->write(dest->fBuffer, skjpeg_destination_mgr::kBufferSize - dest->free_in_buffer)) 1742c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen if (!dest->fStream->write(dest->fBuffer, 1752c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen skjpeg_destination_mgr::kBufferSize)) { 1762c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen ERREXIT(cinfo, JERR_FILE_WRITE); 1772c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen return false; 1782c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen } 1792c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen 1802c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen dest->next_output_byte = dest->fBuffer; 1812c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen dest->free_in_buffer = skjpeg_destination_mgr::kBufferSize; 1822c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen return TRUE; 1832c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen} 1842c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen 1852c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chenstatic void sk_term_destination (j_compress_ptr cinfo) { 1862c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen skjpeg_destination_mgr* dest = (skjpeg_destination_mgr*)cinfo->dest; 1872c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen 1882c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen size_t size = skjpeg_destination_mgr::kBufferSize - dest->free_in_buffer; 1892c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen if (size > 0) { 1902c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen if (!dest->fStream->write(dest->fBuffer, size)) { 1912c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen ERREXIT(cinfo, JERR_FILE_WRITE); 1922c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen return; 1932c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen } 1942c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen } 1952c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen dest->fStream->flush(); 1962c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen} 1972c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen 1982c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chenskjpeg_destination_mgr::skjpeg_destination_mgr(SkWStream* stream) 1992c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen : fStream(stream) { 2002c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen this->init_destination = sk_init_destination; 2012c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen this->empty_output_buffer = sk_empty_output_buffer; 2022c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen this->term_destination = sk_term_destination; 2032c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen} 2042c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen 2052c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chenvoid skjpeg_error_exit(j_common_ptr cinfo) { 2062c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen skjpeg_error_mgr* error = (skjpeg_error_mgr*)cinfo->err; 2072c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen 2082c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen (*error->output_message) (cinfo); 2092c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen 2102c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen /* Let the memory manager delete any temp files before we die */ 2112c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen jpeg_destroy(cinfo); 2122c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen 2132c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen longjmp(error->fJmpBuf, -1); 2142c1275107148cb95b0497cadeeb43e31d5063929Wei-Ta Chen} 215