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